如何在c#中将EF对象附加到新的上下文

时间:2013-06-06 12:51:55

标签: c# wpf entity-framework datacontext

我正在经历EF的A **中的痛苦,而且根据google,我不是唯一有这个问题的人。我有一个从EF获得的对象列表,然后我将此列表设置为itemscontrol的DataContext(WPF)。因为,在“使用”块之后,上下文被销毁,我将不得不在希望保存更改时创建具有相同ID的新查询和对象。我尝试将它附加到Context,我尝试保存更改,但不存储它们。

有些人尝试了几件事,但也许有人知道这个问题有一个方便而聪明的解决方案吗?

我尝试了Attach()AttachTo(),没有任何效果

P.S。这是EF 4.0

已编辑 - 已解决

在附加和保存之间添加以下代码行解决了所有问题 在EF 4.0中

_context.ObjectStateManager.ChangeObjectState(modifiedEntity, System.Data.EntityState.Modified);

在EF 4.1中

_context.Entry(modifiedEntity).State = System.Data.EntityState.Modified;

2 个答案:

答案 0 :(得分:1)

老实说,这有点痛苦。这是我写的关于在我遇到类似问题时附加修改过的对象的帖子,还有其他的,也许它有帮助......

Entity Framework Modify Detached Object

所以,为了避免这种烦恼,这就是我通常做的事情:

public ActionResult Edit(Category cat)
{
  //cat is the modified object
  using(MyEFEntities db = new MyEFEntities())
  {
    var dbCategory = db.Categories.FirstOrDefault(o => o.ID == cat.ID);
    dbCategory.Description = cat.Description.
    dbCategory.Value = cat.Value;
    db.SaveChanges();
  }
}

所以,正如你所看到的,我只是在当前上下文中获取对象,修改它,然后保存,而不是搞乱附着等。将修改后的对象正确地附加到上下文然后保存可能更好,但是我很生气,对我来说是多么不明显(对我而言)。

也许其他人会为您提供更正确的解决方案。

祝你好运。

答案 1 :(得分:1)

当您为新Attach()执行实体框架对象的DbContext时,将使用状态 EntityState.Unchanged 输入该对象。无论对象的属性是否实际上已更改,因为它最初是从DB(在不同的上下文中)获取的,因此会发生这种情况。

要告诉EF有关当前DbContext之外发生的更改,您只需在调用DbContext.SaveChanges()之前将对象的状态设置为 EntityState.Modified

        Foo foo=null;
        using (var db = new MyContext())
        {
            db.Foos.Add( new Foo { MyValue = OLD_VALUE } );
            db.SaveChanges();   // foo written to DB with MyValue = OLD_VALUE

            foo = db.Foos.FirstOrDefault(); // grab foo
        }

        // leave context and update foo...
        foo.MyValue = NEW_VALUE;

        using (var db = new MyContext())
        {
            db.Foos.Attach(foo);    // foo is attached in the 'unchanged' state...
            db.SaveChanges();       // ...so this statement has no effect

            // At this point, db.Foos.FirstOrDefault().MyValue will be NEW_VALUE, yet
            // the "real" value of the object in the DB is OLD_VALUE.

            db.Entry(foo).State = EntityState.Modified; // setting foo to "Modified" will cause...
            db.SaveChanges();                           // ...foo to be written out with NEW_VALUE
        }