Entity framework 强制EF 4.1代码首先查看已修改的附着实体
我发现的所有示例都引用了一个名为ObjectContext的类,该类在CTP5中似乎不存在。我必须强调的是,CTP5是我第一次接触实体框架 我有一个连接到DbContext的已断开连接的POCO。但是SaveChanges并没有接收到更改,我如何告诉我的上下文更新该实体Entity framework 强制EF 4.1代码首先查看已修改的附着实体,entity-framework,code-first,Entity Framework,Code First,我发现的所有示例都引用了一个名为ObjectContext的类,该类在CTP5中似乎不存在。我必须强调的是,CTP5是我第一次接触实体框架 我有一个连接到DbContext的已断开连接的POCO。但是SaveChanges并没有接收到更改,我如何告诉我的上下文更新该实体 _context.Users.Attach(user); // The user has been replaced. _context.SaveChanges(); // The change is not saved. 我
_context.Users.Attach(user);
// The user has been replaced.
_context.SaveChanges();
// The change is not saved.
我做错了什么
2011年1月12日更新
对大多数人来说可能是显而易见的,但作为EF的第一次用户,我没有想到附加一个已经附加的对象会清除以前的状态。这让我很痛苦。但是我想以一种非常通用的方式使用Repository模式,这种方式不关心对象是否已经附加或是由于ASP.NET MVC绑定而新创建的。所以我需要一个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
。如果对象已连接,您将受益于对象的先前状态,这反过来将允许对数据库进行优化更新。但是,如果对象未附着,该方法将强制整个对象变脏
现在看起来很明显,以前没有。希望它能帮助别人
Rich附加实体时,它将变为未更改状态(自附加到上下文后,它一直未更改)。您只需将实体状态显式更改为“已修改”:
为完整起见,您可以通过将DbContext强制转换为IOObjectContextAdapter来访问ObjectContext:
((IObjectContextAdapter)context).ObjectContext.ObjectStateManager.ChangeObjectState(user, EntityState.Modified);
Morteza的方法更简洁,并且得到了我的投票。我相信在调用修改之前不需要附加实体。只需将设置为“修改”即可完成此工作
if (_context.Entry(user).State == EntityState.Detached)
{
_context.Entry(user).State = EntityState.Modified;
}
太好了,谢谢。对于所有不知道的人,EntityState可以在System.Data.Entity DLL中找到。没问题,很高兴它有帮助:)天哪,我真是太感谢你了。两天来我一直在想这个问题。谢谢你,我想我错过了一些明显的东西。
if (_context.Entry(user).State == EntityState.Detached)
{
_context.Entry(user).State = EntityState.Modified;
}