0

EF4.3CodeFirstアプローチでDbContextクラスを使用することに問題があります。

今のところ、データベースから/データベースに物を入れる/入れるために必要なすべてのメソッドを含むリポジトリを作成しました。問題は、そのすべてのメソッドが次のようなコードをラップアラウンドする必要があることです。

  using(var context = new MyDbContext())
  {
    //some code here to run on database
  }

ただし、これを、すべての初期化を実行し、各クエリの後に破棄する単一のクラスにリファクタリングする方法がわかりません。また、DbContextに静的フィールドを使用するべきではないと聞いています(最終的には使用しましたが、機能しましたが、エレガントなソリューションではありません)。私はウェブ上で建設的な情報を見つけていませんし、エレガントな方法でこれを行う方法を説明している本もありません。

よろしくお願いします。

4

1 に答える 1

1

「DbContext per Request」と呼ばれるアプローチを使用してみてください。基本的に、DbContext のインスタンスをオンデマンドで作成し、それを HttpContext にアタッチしてから、Application_EndRequest 中にインスタンスが存在するかどうかを確認し、存在する場合は破棄します。

RequestContext.cs

internal static class RequestContext
{
    internal static MyDbContext Current
    {
        get
        {
            if (!HttpContext.Current.Items.Contains("myContext"))
            {
                HttpContext.Current.Items.Add("myContext", new MyDbContext());
            }
            return HttpContext.Current.Items["myContext"] as MyDbContext;
        }
    }
}

Global.asax.cs

protected void Application_EndRequest(object sender, EventArgs e)
{
     var entityContext = HttpContext.Current.Items["myContext"] as MyDbContext;
     if (entityContext != null)
         entityContext.Dispose();
}

使用例:

public class MyDbAccessClass
{
    public static List<Products> GetProducts()
    {
         var products = from o in RequestContext.Current.Products
                        select o;
         return products.ToList();
    }
}
于 2012-06-13T11:12:27.267 に答える