在EF4中,这是不容易实现的。你必须要降级到经典的ADO.NET(DataReader),使用ObjectContext.Translate或使用EFExtensions项目。
在EF CTP5中是否已经支持这个功能?
如果没有,那么有什么推荐的方法来实现这个功能?
我们需要将DbContext<T>
强制转换为IObjectContextAdapter
并访问底层的ObjectContext
才能使用这个方法吗?
有人可以给我指一篇关于使用EF CTP5实现这个功能的好文章吗?
在EF4中,这是不容易实现的。你必须要降级到经典的ADO.NET(DataReader),使用ObjectContext.Translate或使用EFExtensions项目。
在EF CTP5中是否已经支持这个功能?
如果没有,那么有什么推荐的方法来实现这个功能?
我们需要将DbContext<T>
强制转换为IObjectContextAdapter
并访问底层的ObjectContext
才能使用这个方法吗?
有人可以给我指一篇关于使用EF CTP5实现这个功能的好文章吗?
所以我让它工作了,这是我的实现:
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
方法,这似乎在结果集字段和提供的实体之间进行从左到右的转换。
请注意,该方法是内部的。
我的 Repository 调用此方法,然后将 DTO 进行填充成为我的领域对象。
对于以下 3 个原因,我不完全满意它:
DbContext
强制转换为 IObjectContextAdapter
。在我看来,Translate
方法应该在 DbContext<T>
类上。希望这能帮助某人并向 EF 团队传达信息。我们需要支持 SPROCS 的多个结果。您可以将存储过程映射到复杂类型,那么为什么不能将存储过程映射到多个复杂类型呢?