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