Ответ 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 с полки. Вы можете сопоставить хранимый процесс с сложным типом, поэтому почему мы не можем сопоставить хранимый процесс нескольким сложным типам?