0

「リクエストごとに1つのDbContextインスタンス」アプローチで、Webフォーム(ASP.NET 4.5)でEF 5を使用しています。

しかし、この状況は少し複雑です。複数ステップの作成/編集画面があり、現在のエンティティをセッションに保存し、それを操作して、最後のステップでデータベースにコミットします。

新しいインスタンスを作成することは問題ありませんでしたが、既存のエンティティを編集することは一生できません...別の要求であるため、元の DbContext インスタンスが失われ、新しいインスタンスにアタッチするとAn エンティティが取得されますオブジェクトは、IEntityChangeTrackerエラーの複数のインスタンスによって参照できません。

私のコードは複雑すぎてここに投稿できませんが、正確に要約してみます。

私のDbContext:

public class AppContext : DbContext
{
    // DbSet declarations...

    public static AppContext Current { 
         get { var context = HttpContext.Current.Items["Contexts.AppContext"] as AppContext;
             if (context == null)
             {
                 context = new AppContext();
                 HttpContext.Current.Items["Contexts.AppContext"] = context;
             }
             return context; 
         }
    }
}

ページ コードの例:

protected void Page_Load(object sender, EventArgs e)
{
    int? id = null; // After this, I try to get it from the QueryString, parse it, etc.. Omitted for sake of brevity 

    // If I have an ID, it means I'm editing...
    Session["Product"] = id.HasValue ? new Product() : AppContext.Current.Products.Find(id));

    MethodToPopulateFields(); // Internally, it uses the Session variable
}

protected void Step1(){ // through n
    // Manipulates the Session["Product"] based on page input...
}

protected void Save(){
    var product = Session["Product"] as Product;

    if(product.ID == 0)
        product = AppContext.Current.Products.Add(product);

    // throws an exception:
    // AppContext.Current.Entry(product).State = EntityState.Modified;

    // this too:
    // AppContext.Products.Attach(product);

    AppContext.Current.SaveChanges();
}

データベースから古いエンティティを取得し、手動で更新して保存できることはわかっていますが、すべて最後のステップで実行したくありません...

ありがとうございました。

4

1 に答える 1

0

電話してみる

AppContext.Current.Entry(product).State = EntityState.Detached;

最初の方法で。

于 2012-09-19T20:36:59.813 に答える