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

发布于 2024-10-21 00:52:54 字数 437 浏览 0 评论 0原文

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

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

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

我们是否必须将 DbContext 转换为 IObjectContextAdapter 并访问底层 ObjectContext 才能访问此方法?

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

In EF4, this was not easily possible. You either had to degrade to classic ADO.NET (DataReader), use ObjectContext.Translate or use the EFExtensions project.

Has this been implemented off the shelf in EF CTP5?

If not, what is the recommended way of doing this?

Do we have to cast the DbContext<T> as an IObjectContextAdapter and access the underlying ObjectContext in order to get to this method?

Can someone point me to a good article on doing this with EF CTP5?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

伴我老 2024-10-28 00:52:54

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

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. 我们必须将 DbContext 转换为 IObjectContextAdapter。 IMO 方法 Translate 应该位于 DbContext 类上。
  2. 我们必须使用经典的 ADO.NET 对象。为什么?存储过程是任何 ORM 的必备。我对 EF 的主要抱怨是缺乏存储过程支持,而 EF CTP5 似乎尚未纠正这一问题。
  3. 您必须打开一个新的 SqlConnection。为什么它不能使用与 EF 上下文打开的连接相同的连接?

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

So i got this working, here's what i have:

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;
}

Essentially, it's basically like classic ADO.NET. You read the DbReader, advance to the next result set, etc.

But at least we have the Translate method which seemingly does a left-to-right between the result set fields and the supplied entity.

Note the method is internal.

My Repository calls this method, then hydrates the DTO into my domain objects.

I'm not 100% happy with it for 3 reasons:

  1. We have to cast the DbContext as IObjectContextAdapter. The method Translate should be on DbContext<T> class IMO.
  2. We have to use classic ADO.NET Objects. Why? Stored Procedures are a must have for any ORM. My main gripe with EF is the lack of the stored procedure support and this seems to not have been rectified with EF CTP5.
  3. You have to open a new SqlConnection. Why can't it use the same connection as the one opened by the EF Context?

Hope this both helps someone and sends out a message to the EF team. We need multiple result support for SPROCS off the shelf. You can map a stored proc to a complex type, so why can't we map a stored proc to multiple complex types?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文