我从数据库中读取记录并处理与之关联的ObjectContext。 后来,当消费者完成记录时,我需要在db中更新它。 如何用新的背景来做到这一点?
以下是我如何从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();
返回异常:IEntityChangeTracker的多个实例无法引用对象
更新(解释为什么我不想使用相同的上下文): 产品记录被不同线程中的许多任务消耗,我不会在生产者线程中调用context.SaveChanges,因为线程中的某些记录可能正在设置对产品记录的更改。在这种情况下会发生什么?
答案 0 :(得分:1)
所做的所有更改仅保留在当前上下文中。一旦处理完毕,您所做的所有更改也都会在此背景下消失。如果您有一个带有更改的本地实体,则可以将其附加到新上下文。
context_.Attach(yourContextObject);
之后只需致电
context_.SaveChanges();
答案 1 :(得分:1)
试试这个:
SMEntities newContext = new SMEntities();
foreach(var product in products)
{
newContext.Attach(product);
db.Entry(product).State = EntityState.Modified;
}
newContext.SaveChanges();
答案 2 :(得分:0)
再次附加或替代:在新上下文中再次获取并更新它(ApplyCurrentValues)。另请参阅Entity Framework 4 - ApplyCurrentValues<TEntity> vs. ObjectStateManager.ChangeObjectState