7

私はエンティティ フレームワークに比較的慣れていません。私が見つけることができるすべてのドキュメントや本は、フレームワークの使用方法、またはどのモデルを使用する必要があるかについて説明していますが、フレームワークがどのように機能するかについての詳細な説明は不足しています。

たとえば、LINQ クエリまたはフレームワーク メソッドを介してデータベースからエンティティを読み込む場合、それらのエンティティはスレッド セーフですか? つまり、他のスレッドと共有できますか? もしそうなら、EFは一貫性をどのように制御しますか?

コントロールがコンテキストから外れると、それらのエンティティは消えてしまうのでしょうか、それともメモリ内に残っているのでしょうか? .SaveChanges の後、それらのエンティティはなくなりましたか? ライフサイクルとは?

EFの専門家が上記の点を詳細に説明してください。

前もって感謝します。

4

3 に答える 3

2

ロードされたエンティティのライフサイクルは、それらをロードしたエンティティ コンテキストのライフサイクルに多かれ少なかれ結びついています。したがって、多くの例で次のことがわかります。

using (var ctx = new Context())
{
    // ... do work
}   // The context gets disposed here.

コンテキストが破棄されると (usingステートメントの最後など)、コンテキスト内に読み込まれたエンティティを、それらから追加情報を読み込むことができるかのように扱うべきではありません。たとえば、それらのナビゲーション プロパティにアクセスしようとしないでください。問題を回避するために、私は通常、人々が使用できると予想される正確なデータのみを持つ DTO を作成し、それがusingステートメントから出る唯一の値になるようにするのが最善だと考えています。

using (var ctx = new Context())
{
    var q = from p in ctx.People
            select new PersonSummary{Name = p.Name, Email = p.Email};
    return q.ToList(); // This will fully evaluate the query, 
                       // leaving you with plain PersonSummary objects.
}

エンティティ コンテキストはスレッドセーフではないため、コンテキストのライフサイクル内であっても、同じコンテキストに関連付けられたオブジェクトの複数のスレッドからナビゲーション プロパティなどを読み込もうとしないでください。

于 2012-10-18T15:05:48.467 に答える
2

たとえば、LINQ クエリまたはフレームワーク メソッドを介してデータベースからエンティティを読み込む場合、それらのエンティティはスレッド セーフですか? つまり、他のスレッドと共有できますか? もしそうなら、EFは一貫性をどのように制御しますか?

ObjectContext クラスはトレッド セーフではありません。スレッドごとに 1 つのオブジェクト コンテキストを持つか、独自のスレッド同期プロセスを作成する必要があります。このように、ObjectContext はすべてのオブジェクトの状態を追跡するため、一貫性は ObjectContext によって管理されます。

コントロールがコンテキストから外れると、それらのエンティティは消えてしまうのでしょうか、それともメモリ内に残っているのでしょうか? .SaveChanges の後、それらのエンティティはなくなりましたか? ライフサイクルとは?

ObjectContext クラスは IDisposable インターフェイスから継承するため、Entity Framework を使用する場合は USING ステートメントを使用できますし、使用する必要があります。このようにして、using ステートメントを閉じた後、それらはなくなります。追跡されているコンテキストを破棄しないと、状態のみが変更されますObjectContext インスタンスを破棄すると、データベース接続が適切に破棄され、データベース接続がリークしていないことも確認されます。

したがって、大きな問題は次のとおりです。

EF はいつ、どこに住むべきですか?

これらのORMは、Unit of Work パターンとして扱う必要があります。つまり、ORM オブジェクトは、ビジネス タスクが完了するまで存続する必要があります。

私の特定のシナリオでは、面倒な作業を行うWindsorのようなIoCコンテナーを使用します。たとえば、ASP.NET MVC アプリでは、Windsor はWeb Request ごとに Contextを作成できます。これにより、コード全体で多くのステートメントを記述する必要がなくなります。詳細については、こちらをご覧ください。using

ウィンザー チュートリアル - パート 7 - ライフスタイル


Microsoft でフレームワークの構築を支援している担当者から直接、詳細を説明するリンクを次に示します。

Entity Framework Object Context Life Cycle と Linq to Sql Data Context Life Cycle の比較

于 2012-10-18T15:15:19.003 に答える