11

在EF4中,这是不容易的。您必须降级到传统的ADO.NET(DataReader),请使用ObjectContext.Translate或使用EFExtensions项目。实体框架CTP5 - 从存储过程读取多个记录集

EF CTP5中已经实现了这种现成的产品吗?

如果不是,建议如何做到这一点?

我们有铸DbContext<T>IObjectContextAdapter,为了得到这个方法访问底层ObjectContext

有人能指点我一篇关于EF CTP5做这件事的好文章吗?

+0

没有人得到任何东西? =( – RPM1984 2011-03-10 22:19:30

回答

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

我不是3个原因,100%满意的:

  1. 我们要投的DbContextIObjectContextAdapter。方法Translate应该在DbContext<T>类IMO上。我们不得不使用经典的ADO.NET对象。为什么?对于任何ORM,存储过程是必须有。我对EF的主要抱怨是缺乏存储过程支持,这似乎还没有通过EF CTP5纠正。
  2. 你必须打开一个新的SqlConnection。为什么它不能使用与EF上下文打开的连接相同的连接?

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

+0

).Translate方法也非常挑剔。“数据读取器与指定的'MyPoco'不兼容。 类型的成员(某些数据类型在此)在数据读取器中没有相应的列,一样的名字。” – granadaCoder 2014-01-07 20:28:55