0

データベースからレコードを読み取り、それに関連付けられている ObjectContext を破棄します。後で消費者がレコードで終了したら、データベースで更新する必要があります。新しいコンテキストでそれを行うにはどうすればよいですか?

db からレコードを読み取り、BlockingCollection に入れる方法は次のとおりです。

    var products = from r in context_.Products                                   
                               orderby r.id
                               select r;

    List<Product> pList = products.Take(10).ToList();

データベース内のこれらのレコードを新しいコンテキストで更新する方法は? ありがとう!

私は次のことを試みましたが、失敗しました:

                SMEntities context = new SMEntities();
                Product p = outPipe.GetConsumingEnumerable().First();
                outContext.Products.Attach(p);
                outContext.SaveChanges();

Exception: object cannot be referenced by multiple instances of IEntityChangeTracker で返されます

更新 (同じコンテキストを使用したくない理由の説明): 製品レコードは異なるスレッドの多くのタスクによって消費され、スレッド内のレコードの一部が途中にある可能性があるため、プロデューサー スレッドで context.SaveChanges を呼び出しません。製品レコードへの設定変更の。この場合はどうなりますか?

4

3 に答える 3

1

行われたすべての変更は、現在のコンテキストでのみ保持されます。破棄されると、すべての変更もそのコンテキスト内で失われます。変更のあるローカルエンティティがある場合は、それを新しいコンテキストにアタッチできます。

context_.Attach(yourContextObject);

その後、電話するだけ

context_.SaveChanges();
于 2013-03-12T07:53:50.733 に答える
1

これを試して:

SMEntities newContext = new SMEntities();
foreach(var product in products)
{
   newContext.Attach(product);
   db.Entry(product).State = EntityState.Modified;
}
newContext.SaveChanges();
于 2013-03-12T08:21:49.967 に答える
0

再度アタッチするか、代替方法: 新しいコンテキストで再度取得し、更新します (ApplyCurrentValues)。Entity Framework 4 - ApplyCurrentValues<TEntity> と ObjectStateManager.ChangeObjectStateも参照してください。

于 2013-03-12T08:19:12.647 に答える