Stored procedures 实体框架CTP5-从存储过程读取多个记录集
在EF4中,这是不容易做到的。您必须降级到经典的ADO.NET(DataReader),使用或使用EFExtensions项目 这在EF CTP5中是否已实施 如果没有,建议的方法是什么 我们是否必须将Stored procedures 实体框架CTP5-从存储过程读取多个记录集,stored-procedures,entity-framework-ctp5,multiple-resultsets,Stored Procedures,Entity Framework Ctp5,Multiple Resultsets,在EF4中,这是不容易做到的。您必须降级到经典的ADO.NET(DataReader),使用或使用EFExtensions项目 这在EF CTP5中是否已实施 如果没有,建议的方法是什么 我们是否必须将DbContext转换为IObjectContextAdapter并访问底层ObjectContext,才能使用此方法 有人能给我介绍一篇关于EF CTP5的好文章吗?因此,我成功地做到了这一点,以下是我所拥有的: internal SomeInternalPOCOWrapper FindXXX(
DbContext
转换为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;
}
内部SomeInternalPOCOWrapper FindXXX(字符串xxx)
{
条件.Requires(xxx).IsNotNullOrEmpty();
var someInternalPokey=new someinternalpocowraper();
var ctx=(作为IObjectContextAdapter);
var con=新的SqlConnection(“xxxxx”);
{
con.Open();
DbCommand cmd=con.CreateCommand();
cmd.CommandText=“exec dbo.usp_XXX@xxxx”;
cmd.Parameters.Add(新的SqlParameter(“xxxx”,xxx));
使用(var rdr=cmd.ExecuteReader())
{
//--结果集#1
someInternalPokey.Prop1=ctx.Translate(rdr);
//--结果集#2
rdr.NextResult();
someInternalPokey.Prop2=ctx.Translate(rdr);
//--结果集#3
rdr.NextResult();
someInternalPokey.Prop3=ctx.Translate(rdr);
//结果集#4
rdr.NextResult();
someInternalPokey.Prop4=ctx.Translate(rdr);
}
con.Close();
}
返回一些内部pokey;
}
基本上,它与经典的ADO.NET类似。您可以阅读DbReader
,前进到下一个结果集,等等
但至少我们有Translate
方法,它似乎在结果集字段和提供的实体之间进行从左到右的转换
注意,该方法是内部的
我的存储库调用此方法,然后将DTO添加到我的域对象中
我对它不是100%满意,原因有三:
DbContext
转换为IObjectContextAdapter
。方法Translate
应该在DbContext
class IMO上希望这既能帮助别人,也能向EF团队传达信息。我们需要对现成存储过程的多结果支持。您可以将存储过程映射到复杂类型,那么为什么我们不能将存储过程映射到多个复杂类型?Translate方法也非常挑剔。“数据读取器与指定的‘MyPoco’不兼容。该类型的成员(此处的某些数据类型)在数据读取器中没有同名的对应列。”