4

私はこれをたくさんやっていることに気づきます:

using(var db = new MyDbContext())
{
  return db.Users.ToList(); // or some other simple query
}

これらの単純なケースには、次のようなものがあれば便利です。

return MyDbContext.Execute(db => db.Users);

しかし、拡張メソッドをどのように実行するかはわかりません。理想的には(私は思うに)DbContextを取り(コードを再利用できるように)、テンプレート化されたIListを返します。しかしこれは可能ですか?

もちろん、これを行う方法がすでにある場合は、それについて聞いてみたいと思います。

4

3 に答える 3

5

このための最も単純な静的クラスを作成できます。拡張メソッドは必要ありません。インスタンスが必要なためです(例の構文に基づくと、まだインスタンスはありません)。

public static class MyDbContextStatic { 
    public static T Execute(Func<MyDbContext, T> f) {
        using (var db = new MyDbContext())
            return f(db);
    }
}

使用するには:

var users = MyDbContextStatic.Execute(db => db.Users);

IIRCの場合、DbContextも破棄する前に、各オブジェクトでDetachなどを呼び出すことをお勧めします。しかし、あなたはその考えを理解します。

于 2012-08-28T04:55:59.923 に答える
2

最初の例はそれを行う適切な方法ですDispose。ブロックの終了後に必ず呼び出します。これにより、接続が閉じられます。あなたはあなたの仕事をするための拡張メソッドを思い付くかもしれません、しかしそれはあなたがDbContext静的のためにメモリ内に参照を持っていることを要求するでしょうDbContext

データベース接続に関しては、できるだけ遅く開いて、できるだけ早く閉じる必要があります。

于 2012-08-28T04:52:27.763 に答える
0

DbContextは、基盤となる接続を管理します。
Disposeを呼び出すことはできますが、ほとんどの一般的なシナリオでは、呼び出す必要はありません。

http://blog.jongallant.com/2012/10/do-i-have-to-call-dispose-on-dbcontext.html

于 2016-01-28T08:32:28.853 に答える