11

在 EF4 中,这并不容易。您要么必须降级到经典 ADO.NET (DataReader),要么使用ObjectContext.Translate ,要么使用EFExtensions项目。

这是否已在 EF CTP5 中现成实施?

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

我们是否必须将as 转换DbContext<T>为 anIObjectContextAdapter并访问底层ObjectContext才能使用此方法?

有人可以给我指出一篇关于使用 EF CTP5 执行此操作的好文章吗?

4

1 回答 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一种方法,它似乎在结果集字段和提供的实体之间进行了从左到右的操作。

请注意,该方法是内部的。

我的存储库调用此方法,然后将 DTO水合到我的域对象中。

我对它不是 100% 满意,原因有 3 个:

  1. 我们必须强制转换DbContextas IObjectContextAdapter。该方法Translate应该在DbContext<T>IMO 类上。
  2. 我们必须使用经典的 ADO.NET 对象。为什么?存储过程是任何 ORM的必备工具。我对 EF 的主要抱怨是缺乏存储过程支持,而这似乎没有被 EF CTP5 纠正。
  3. 您必须打开一个新的 SqlConnection。为什么它不能使用与 EF 上下文打开的连接相同的连接?

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

于 2011-03-15T23:45:32.020 回答