所以我得到这个工作,这是我有:
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到我的域对象。
我不是3个原因,100%满意的:
- 我们要投的
DbContext
为IObjectContextAdapter
。方法Translate
应该在DbContext<T>
类IMO上。我们不得不使用经典的ADO.NET对象。为什么?对于任何ORM,存储过程是必须有。我对EF的主要抱怨是缺乏存储过程支持,这似乎还没有通过EF CTP5纠正。
- 你必须打开一个新的SqlConnection。为什么它不能使用与EF上下文打开的连接相同的连接?
希望这可以帮助某人并向EF团队发送消息。我们需要对现成的SPROCS提供多种结果支持。您可以将存储的proc映射到复杂类型,那么为什么我们不能将存储的proc映射到多个复杂类型的?
没有人得到任何东西? =( – RPM1984 2011-03-10 22:19:30