Возврат Int и сложного типа из хранимой процедуры с использованием Entity Framework 5.0

У меня есть проект, в котором мне дали хранимую процедуру, которую я должен использовать. Он используется для создания новой записи в базе данных. Он возвращает Int32, который является новым идентификатором записи в таблице. Он также имеет временную таблицу, в которой ошибки сохраняются и отправляются обратно во втором результате. Итак, в основном последние две строки

SELECT @NewID
SELECT * From @ErrorsTable

Я должен использовать Entity Framework для вызова хранимой процедуры. Моя проблема. Я не могу понять, как получить оба возвращаемых результата.

По умолчанию при обновлении из базы данных просто возвращается Int32. Я попытался следовать некоторым примерам, в которых они возвращают несколько результатов из хранимой процедуры, но я думаю, что это не работает для меня, потому что все примеры возвращают несколько сложных типов, а у меня есть смесь скалярного и сложного типа.


person I can be anything    schedule 13.08.2014    source источник


Ответы (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, что в моем случае нормально. Но это основы того, что я сделал, и их можно изменить по мере необходимости.

person I can be anything    schedule 18.08.2014