エンティティフレームワークコンテキストを初期化するための最良の方法は?

c# entity-framework

質問

エンティティフレームワークコンテキストを初期化するとき。

1つはクラスレベルで初期化することです。

public class EntityContactManagerRepository
    : ContactManager.Models.IContactManagerRepository
{
    private ContactManagerDBEntities _entities = new ContactManagerDBEntities();

    // Contact methods
    public Contact GetContact(int id)
    {
        return (from c in _entities.ContactSet.Include("Group")
                where c.Id == id
                select c).FirstOrDefault();
    }
}

もう1つの方法は、メソッドレベルで初期化することです。

public class EntityContactManagerRepository
    : ContactManager.Models.IContactManagerRepository
{    
    // Contact methods
    public Contact GetContact(int id)
    {
       using (var entities = new ContactManagerDBEntities())
           return (from c in entities.ContactSet.Include("Group")
               where c.Id == id
               select c).FirstOrDefault();
    }
}

Ado.Netの経歴から言えば、私は後者の方法で初期化する方が好きですが、最初の方法はStephen Waltheによって開発された例からのものです。または別の質問、それはまったく問題ですか?

受け入れられた回答

2つの異なるコンテキスト上のオブジェクトは互いに関係を持つことができないため、コンテキストは変更追跡データの有効期間を制御し、オブジェクトを編集するときにどのオブジェクトインスタンスをリンクできるかにも影響を与えるため重要です。あなたが共有している例がASP.NET MVCアプリケーションから来ているように私には見えます。この場合、リクエストは短命であり、リクエスト内のオブジェクトを更新するときに他のオブジェクトをフェッチしてそれらの間の関係を作成しなければならないのが一般的なので、リクエストごとに1つのエンティティコンテキストを使います。

その一方で、エンティティコンテキストを長期間保持したくない場合があります。これは、より多くのオブジェクトへの変更を追跡するときにメモリを消費するためです。

これは「クラスごとに1つのコンテキスト」オプションに対する引数のように思えるかもしれませんが、実際は違います。これは「作業単位ごとに1つのコンテキスト」という議論のようなものです。


人気のある回答

一般的に言って、それはASP.NETの要求ごとのコンテキストとWinForms / WPFのウィンドウごとのコンテキストです。

リクエストごとのコンテキストパラダイムの背後にある推論をかなりよく説明する記事があります: Entity Framework Object Context Scope



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ