2016-05-04 18 views
0

ObjectContextを使用して、Entity Frameworkを使用しているときに複数結果セットストアドプロシージャの結果を取得する方法を示すexamplesがあります。
これらの例では、DbContextが表示され、IObjectContextAdapterにキャストされ、同じ行が数行アップしたとしてもObjectContextになります。各結果セットのObjectContextは変更されますか?

using (var db = new BloggingContext()) 
{ 
    db.Database.Initialize(force: false); 
    var cmd = db.Database.Connection.CreateCommand(); 
    cmd.CommandText = "[dbo].[GetAllBlogsAndPosts]"; 
    try 
    { 
     db.Database.Connection.Open(); 
     var reader = cmd.ExecuteReader(); 
     var blogs = ((IObjectContextAdapter)db) 
      .ObjectContext            //First Time 
      .Translate<Blog>(reader, "Blogs", MergeOption.AppendOnly); 
     foreach (var item in blogs) 
     { 
      Console.WriteLine(item.Name); 
     } 

     reader.NextResult(); 
     var posts = ((IObjectContextAdapter)db) 
      .ObjectContext            //Second Time 
      .Translate<Post>(reader, "Posts", MergeOption.AppendOnly); 

     foreach (var item in posts) 
     { 
      Console.WriteLine(item.Title); 
     } 
    } 
    finally 
    { 
     db.Database.Connection.Close(); 
    } 
} 

私のストアドプロシージャは、多くの結果セットを返すので、私は、参照をコピーして、できるだけ多くのコードを簡素化したいと思います:

例からMSDN(オリジナルのコメントは私のコメントを簡素化し、強調するために除去されます)ローカル変数にはObjectContextになりますが、そうすることで問題が発生するかどうかわかりません。
"概念的に 'DbContext'が 'ObjectContext'と同じであることを示すarticleが見つかりました。
オブジェクトインスタンスのスコープと有効期間を明示的に示すものは見つかりませんでした。
ObjectContextのドキュメントには詳細が少し欠けています。

私はすべての回答をサポートする公式文書へのリンクを希望します。

答えて

0

DbContextは、ObjectContextのラッパーです。したがって、IObjectContextAdapterインターフェイスを使用してアクセスできる1つのObjectContextインスタンスが含まれています。 IObjectContextAdapter.ObjectContextは常に同じインスタンスを返します。あなたは絶対に確認したい場合は

は、ちょうどそれが二度同じ値が表示されます

Console.WriteLine(((IObjectContextAdapter)db).ObjectContext.GetHashCode()); 
Console.WriteLine(((IObjectContextAdapter)db).ObjectContext.GetHashCode()); 

の出力を確認してください。

+0

ご返信ありがとうございます。私はこれを証明するドキュメントを探していますが、これは1つの実装でうまくいくことを示しています。 'DbContext'が' ObjectContext'の周りのラッパーであることについての文書で十分です。 – Trisped

+0

これは1つの実装で機能しますが、これは唯一の実装です。 EFには 'IObjectContextAdapter'を実装するものは何もありません。私はEFチームが単に文書を忘れてしまったと思います。ドキュメントの唯一の公式なヒントは、書籍 "DbContext"のLerman&Millerが "* the *基本ObjectContext"(emphasis mine)というフレーズを繰り返し使用していることです。また、 'IObjectContextAdapter.ObjectContext'自体のXMLドキュメントは:"このコンテキストの基礎をなすEntity Framework ObjectContextを返します。 " –

+0

あなたのコードが 'ObjectContext'参照の間の参照比較を行わず、元の質問で要求されたように結果セットを変更しないという事実にもかかわらず、私は先に進み、受け入れました。この時点で私は前進する準備が整いました。あなたが望むならば、気をつけてください。 – Trisped

関連する問題