Entity Framework CTP5 - чтение нескольких наборов записей из хранимой процедуры

В EF4 это было непросто. Вы либо должны были деградировать до классического ADO.NET(DataReader), использовать ObjectContext.Translate или использовать EFExtensions.

Было ли это реализовано с полки в EF CTP5?

Если нет, то каков рекомендуемый способ сделать это?

Нужно ли использовать DbContext<T> как IObjectContextAdapter и получить доступ к базовому ObjectContext, чтобы перейти к этому методу?

Может ли кто-нибудь указать мне хорошую статью об этом с помощью EF CTP5?

Ответ 1

Итак, я получил эту работу, вот что у меня:

internal SomeInternalPOCOWrapper FindXXX(string xxx)
{
    Condition.Requires(xxx).IsNotNullOrEmpty();

    var someInternalPokey = new SomeInternalPOCOWrapper();
    var ctx = (this as IObjectContextAdapter).ObjectContext;

    var con = new SqlConnection("xxxxx");
    {
        con.Open();
        DbCommand cmd = con.CreateCommand();
        cmd.CommandText = "exec dbo.usp_XXX @xxxx";
        cmd.Parameters.Add(new SqlParameter("xxxx", xxx));

        using (var rdr = cmd.ExecuteReader())
        {
            // -- RESULT SET #1
            someInternalPokey.Prop1 = ctx.Translate<InternalPoco1>(rdr);

            // -- RESULT SET #2
            rdr.NextResult();
            someInternalPokey.Prop2 = ctx.Translate<InternalPoco2>(rdr);

            // -- RESULT SET #3
            rdr.NextResult();
            someInternalPokey.Prop3 = ctx.Translate<InternalPoco3>(rdr);

            // RESULT SET #4
            rdr.NextResult();
            someInternalPokey.Prop4 = ctx.Translate<InternalPoco4>(rdr);
        }
        con.Close();
    }

    return someInternalPokey;
}

По существу, он в основном похож на классический ADO.NET. Вы читаете DbReader, переходите к следующему набору результатов и т.д.

Но по крайней мере у нас есть метод Translate, который, по-видимому, делает слева направо между полями набора результатов и предоставленным объектом.

Обратите внимание, что метод является внутренним.

Мой репозиторий вызывает этот метод, затем гидратирует DTO в мои объекты домена.

Я не на 100% доволен этим по трем причинам:

  • Мы должны указать DbContext как IObjectContextAdapter. Метод Translate должен быть в DbContext<T> классе IMO.
  • Мы должны использовать классические объекты ADO.NET. Зачем? Хранимые процедуры должны иметь для любого ORM. Моя главная проблема с EF заключается в отсутствии поддержки хранимых процедур, и это, похоже, не устранено с помощью EF CTP5.
  • Вам нужно открыть новый SqlConnection. Почему он не может использовать то же соединение, что и открытое контекстом EF?

Надеюсь, что это поможет кому-то и отправит сообщение команде EF. Нам нужна поддержка нескольких результатов для SPROCS с полки. Вы можете сопоставить хранимый процесс с сложным типом, поэтому почему мы не можем сопоставить хранимый процесс нескольким сложным типам?