更新在ADO.net实体数据模型中不起作用
问题描述:
我使用ADO.net实体数据模型用于数据库工作。更新在ADO.net实体数据模型中不起作用
在我的程序中,我想更新用户表的记录,所以我使用下面的代码来执行此操作。
在此函数中,我发送更改的用户信息,然后用当前用户信息覆盖信息。
我运行objUser = _user;
后,然后致电objContext.SaveChanges();
保存更改。
但是当我这样做时,更改不会持久到数据库。我将这段代码用于其他程序,但在这种情况下,代码不起作用!
public void Update(tbLiUser _user)
{
LinkContext objContext = this.Context;
tbLiUser objUser = objContext.tbLiUsers.First(u => u.tluId == _user.tluId);
objContext.Attach(objUser);
objUser = _user;
objContext.SaveChanges();
}
答
首先,如果你已经从objContext
检索objUser
,真的没有点在用户连接到上下文只是取回后。所以,我在这里完全放弃这一行:
objContext.Attach(objUser);
而且 - 你可能只需要从值更新每个属性的基础上objUser
在_user
,而不仅仅是分配整个对象。
为了帮助您避免繁琐的代码,您可以使用类似AutoMapper之类的东西来让您将属性从一种对象类型分配给另一种。或者你可以创建一个智能程序会比较上objUser
,它们事实上从_user
的值不同的两个objUser
和_user
和更新只有那些特性 - 不应该太难创建方法:
objUser.UpdateValuesFromOtherUser(_user);
objContext.SaveChanges();
objUser和_user是对象的句柄。当你找到objUser时,你会发现一个对象,把它的句柄赋给objUser,并将它添加到你的上下文中。当你说objUser = _user时,你不更新对象,你只是将变量指向一个不同的对象。上下文仍然指向旧对象。正如marc_s所说,你需要一个接一个地复制属性,或者有一些快捷方式可以“批量”复制它们,但重点是你必须更新现有的对象,而不是重新分配它。 – Jay 2013-03-15 21:38:12