更新db中的记录

时间:2013-03-12 07:51:17

标签: c# entity-framework .net-4.0

我从数据库中读取记录并处理与之关联的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,因为线程中的某些记录可能正在设置对产品记录的更改。在这种情况下会发生什么?

3 个答案:

答案 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