0

我正在经历 EF 的 A** 的痛苦,根据谷歌,我不是唯一一个遇到这个问题的人。我有一个从 EF 获得的对象列表,然后我将此列表设置为 itemscontrol 的 DataContext (WPF)。因为,在“使用”块之后,上下文被破坏了,当我希望保存更改时,我必须使用相同的 ID 进行新的查询和对象。我尝试将它附加到上下文,我尝试保存更改,但它们没有被存储。

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

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

PS这是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;
4

2 回答 2

1

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

实体框架修改分离对象

所以,为了避免刺激,我通常会这样做:

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();
  }
}

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

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

祝你好运。

于 2013-06-06T13:12:48.057 回答
1

当您Attach()对一个 Entity Framework 对象执行一个 newDbContext时,它会使用 State EntityState.Unchanged输入。无论对象的属性是否实际上已更改,因为它最初是从数据库中获取的(在不同的上下文中),都会发生这种情况。

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

        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
        }
于 2013-06-06T13:45:29.023 回答