问题 实体框架CTP5 - 从存储过程中读取多个记录集


在EF4中,这不容易实现。你要么降级到经典的ADO.NET(DataReader),请使用 ObjectContext.Translate 或使用 EFExtensions 项目。

这是在EF CTP5中实现的吗?

如果没有,推荐的方法是什么?

我们必须施展 DbContext<T> 作为一个 IObjectContextAdapter 并访问底层 ObjectContext 为了得到这个方法?

有人能指点我用EF CTP5做一篇好文章吗?


3308
2018-03-09 22:57


起源

没有人得到任何东西? =( - RPM1984


答案:


所以我得到了这个工作,这就是我所拥有的:

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进入我的域对象。

我不是百分之百满意,原因有以下几点:

  1. 我们必须施展 DbContext 如 IObjectContextAdapter。方法 Translate 应该是 DbContext<T> IMO课程。
  2. 我们必须使用经典的ADO.NET对象。为什么?存储过程是一个 一定有 对于任何ORM。我对EF的主要抱怨是缺乏存储过程支持,这似乎没有用EF CTP5纠正。
  3. 您必须打开一个新的SqlConnection。为什么它不能使用与EF Context打开的连接相同的连接?

希望这有助于某人并向EF团队发送消息。我们需要为SPROCS提供多种结果支持。您可以将存储过程映射到复杂类型,因此我们为什么不能将存储过程映射到 多种复杂类型


11
2018-03-15 23:45



.Translate方法也非常挑剔。 “数据阅读器与指定的'MyPoco'不兼容。该类型的成员(此处的某些数据类型)在数据阅读器中没有相应的列具有相同的名称。” - granadaCoder