我正在经历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;
答案 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
}