1. ホーム
  2. entity-framework

Entity Frameworkとcontext.dispose()の呼び出し

2023-10-28 08:55:29

質問

どのような場合に 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;
    }
    
    

どのように解決するのですか?

実際には、これは1つの2つの質問です。

  1. いつ Dispose() にする必要がありますか?
  2. コンテキストの寿命はどうすればいいですか?

回答

  1. 決して 1 . using は暗黙の Dispose() の中に try-finally ブロックの中に 別の Dispose ステートメントは、先に例外が発生したときに見逃される可能性があります。また、ほとんどの一般的なケースで Dispose を全く呼ばないこと(暗黙的あるいは明示的に) は有害ではありません .

  2. などを参照してください。 Entity Framework 4 - winformアプリケーションにおけるコンテキストの寿命/スコープ . 要するに、寿命は "short" であるべきで、静的なコンテキストは悪いです。


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