Stored procedures 实体框架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(

在EF4中,这是不容易做到的。您必须降级到经典的ADO.NET(DataReader),使用或使用EFExtensions项目

这在EF CTP5中是否已实施

如果没有,建议的方法是什么

我们是否必须将
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上
  • 我们必须使用经典的ADO.NET对象。为什么?对于任何ORM,存储过程都是必须的。我对EF的主要不满是缺少存储过程支持,而这似乎还没有通过EF CTP5得到纠正
  • 您必须打开一个新的SqlConnection。为什么它不能使用与EF上下文打开的连接相同的连接

  • 希望这既能帮助别人,也能向EF团队传达信息。我们需要对现成存储过程的多结果支持。您可以将存储过程映射到复杂类型,那么为什么我们不能将存储过程映射到多个复杂类型?

    Translate方法也非常挑剔。“数据读取器与指定的‘MyPoco’不兼容。该类型的成员(此处的某些数据类型)在数据读取器中没有同名的对应列。”