我发现的所有示例都引用了一个名为 ObjectContext 的类,该类在 CTP5 中似乎不存在。在这一点上我必须强调,CTP5 是我第一次接触 Entity Framework 。
我有一个已连接到我的 DbContext 的断开连接的 POCO。虽然 SaveChanges 没有接受更改,但我如何告诉我的上下文来更新该实体?
_context.Users.Attach(user);
// The user has been replaced.
_context.SaveChanges();
// The change is not saved.
我究竟做错了什么?
2011 年 12 月 1 日更新
对大多数人来说可能很明显,但是作为 EF 的第一次用户,我没有想到附加一个已经附加的对象会清除以前的状态。这给我带来了很大的痛苦。但是我想以一种非常通用的方式使用存储库模式,这种方式不关心对象是否已经附加或者是由于 ASP.NET MVC 绑定(bind)而新创建的。所以我需要一个
UpdateUser
方法,我附在下面。 public User UpdateUser(User user) {
if (_context.Entry(user).State == EntityState.Detached) {
_context.Users.Attach(user);
_context.Entry(user).State = EntityState.Modified;
}
return user;
}
该方法显然假设对象以某种方式存在于数据存储中,它被称为
UpdateUser
毕竟。如果对象已附加,您将受益于对象的先前状态,这反过来将允许对 DB 进行优化更新。但是,如果没有附加对象,该方法会强制整个对象变脏。现在看起来很明显,以前没有。希望它可以帮助某人。
富有的
最佳答案
当您附加一个实体时,它会进入未更改状态(自从它附加到上下文后它没有被更改)。您只需将实体状态显式更改为已修改:
_context.Users.Attach(user);
_context.Entry(user).State = System.Data.Entity.EntityState.Modified;
_context.SaveChanges();
关于entity-framework - 强制 EF 4.1 Code First 将附加实体视为已修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4413872/