75

DbContext.dispose()いつエンティティ フレームワークを呼び出す必要がありますか?

  1. この架空の方法は悪いですか?

    public static string GetName(string userId)
    {
        var context = new DomainDbContext();
        var userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
        context.Dispose();
        return userName;
    }
    
  2. これは良いですか?

    public static string GetName(string userId)
    {
        string userName;
        using(var context = new DomainDbContext()) {
            userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
            context.Dispose();
        }
        return userName;
    }
    
  3. これはさらに良いですか、つまり、using() を使用するときに context.Dispose() を呼び出さないでください。

    public static string GetName(string userId)
    {
        string userName;
        using(var context = new DomainDbContext()) {
            userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
        }
        return userName;
    }
    
4

6 に答える 6

115

実際、これは 2 つの質問を 1 つにまとめたものです。

  1. いつDispose()コンテキストを取得する必要がありますか?
  2. 私のコンテキストの寿命は何ですか?

答え:

  1. 決して 1 . ブロック内usingの暗黙的です。例外が以前に発生した場合、別のステートメントを見逃す可能性があります。また、ほとんどの場合、(暗黙的または明示的に) まったく呼び出しを行わなくても害はありませんDispose()try-finallyDisposeDispose

  2. たとえば、Entity Framework 4 - winform アプリケーションのコンテキストのライフスパン/スコープを参照してください。要するに、寿命は「短い」べきであり、静的コンテキストは悪いです。


1一部の人々がコメントしているように、この規則の例外は、コンテキストがIDisposableそれ自体を実装し、そのライフサイクルを共有するコンポーネントの一部である場合です。その場合、コンポーネントcontext.Dispose()Disposeメソッドを呼び出します。

于 2013-03-27T18:52:01.683 に答える
40

EFを使用するためにいくつかの優れたチュートリアルに従いましたが、コンテキストは破棄されません。

私はそれについて少し興味があり、尊敬されている Microsoft VIP でさえコンテキストを破棄しないことに気付きました。通常の状況では、dbContext を破棄する必要がないことがわかりました。

さらに詳しい情報が必要な場合は、その理由をまとめたこのブログ投稿をお読みください。

于 2014-06-21T15:09:31.200 に答える
16

さらに良い:

public static string GetName(string userId)
{
    using (var context = new DomainDbContext()) {
        return context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
    }
}

usingスコープ外から結果を返す必要はありません。すぐに返すだけで、目的の破棄動作が得られます。

于 2015-04-16T20:03:31.650 に答える
2

データベース コンテキストをクラス フィールドとして定義し、実装することができますIDisposable。以下のようなもの:

public class MyCoolDBManager : IDisposable
{
    // Define the context here.
    private DomainDbContext _db;

    // Constructor.
    public MyCoolDBManager()
    {
        // Create a new instance of the context.
        _db = new DomainDbContext();
    }

    // Your method.
    public string GetName(string userId)
    {           
        string userName = _db.UserNameItems.FirstOrDefault(x => x.UserId == userId);

        return userName;
    } 

    // Implement dispose method.
    // NOTE: It is better to follow the Dispose pattern.
    public void Dispose()
    {
         _db.dispose();
         _db = null;
    }
}
于 2016-12-05T21:39:00.527 に答える