Entity Framework CTP5 - 从存储过程中读取多个记录集

11

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

在EF CTP5中是否已经支持这个功能?

如果没有,那么有什么推荐的方法来实现这个功能?

我们需要将DbContext<T>强制转换为IObjectContextAdapter并访问底层的ObjectContext才能使用这个方法吗?

有人可以给我指一篇关于使用EF CTP5实现这个功能的好文章吗?

1个回答

11

所以我让它工作了,这是我的实现:

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 个原因,我不完全满意它:

  1. 我们必须将 DbContext 强制转换为 IObjectContextAdapter。在我看来,Translate 方法应该在 DbContext<T> 类上。
  2. 我们必须使用经典的 ADO.NET 对象。为什么?存储过程是任何 ORM 必备的。我对 EF 的主要抱怨是缺少存储过程支持,并且在 EF CTP5 中似乎未得到纠正。
  3. 您必须打开一个新的 SqlConnection。为什么不能使用由 EF Context 打开的相同连接?

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接