Возврат Int и сложного типа из хранимой процедуры с использованием Entity Framework 5.0
У меня есть проект, где мне дали хранимую процедуру, которую я должен использовать. Он используется для создания новой записи в базе данных. Возвращает Int32
который является новым идентификатором записи в таблице. Он также имеет временную таблицу, где ошибки хранятся и отправляются обратно во второй результат. Так что в основном последние две строки
SELECT @NewID
SELECT * From @ErrorsTable
Я должен использовать Entity Framework для вызова хранимой процедуры. Моя проблема, я не могу понять, как получить оба результата.
При обновлении из базы данных по умолчанию просто возвращается Int32
, Я попытался следовать некоторым примерам, в которых они многократно возвращают результаты хранимой процедуры, но я думаю, что она не работает для меня, потому что все примеры возвращают несколько сложных типов, и у меня есть сочетание скалярного и сложного типов.
1 ответ
Поэтому я решил, что в итоге решил эту проблему, в основном следуя опции "только код" по этой ссылке http://msdn.microsoft.com/en-us/data/jj691402.aspx
Я добавил новый метод в свой репозиторий, который вызвал хранимую процедуру и возвратил несколько наборов результатов. Нечто подобное
Public Object[] StoredProcCall(string storedProc, SqlDbParams sqlParams, type[] types)
{
var cmd = dbContext.Database.Connection.CreateCommand();
cmd.CommandText = storedProc;
cmd.CommandType = CommandType.StoredProcedure;
if(parameters != null)
cmd.Parameters.AddRange(sqlParams);
var reader = cmd.ExecuteReader();
try
{
dbContext.Database.Connection.Open();
object[] mObj = new object[types.Count];
for(int i = 0; i < types.Count; i++)
{
System.Reflection.MethodInfo method = typeof(AutoMapper.Mapper).GetMethod("DynamicMap", new Type[] { typeof(object)});
var generic = method.MakeGenericMethod(types[i]);
objected mappedData = generic.Invoke(this, new object[] { reader});
mObj[i] = mappedData;
if(!reader.NextResult())
break;
}
return mObj;
}
finally
{
dbContext.Database.Connection.Close();
}
}
Единственная мысль - чтобы это работало, мне нужно было создать класс, состоящий только из одного свойства - моего простого типа. и каждый тип в массиве должен быть IEnumerable, что нормально в моем случае. Но это основа того, что я сделал и может быть изменено по мере необходимости.