我的数据层中有一个更新方法,如下所示:
public clacc datalayerSec_User
private objUIData as new UIData
Public Function Update(ByVal objUser As SEC_USER) As Boolean
Try
objUIData.SEC_USERs.Attach(objUser)
objUIData.Refresh(RefreshMode.KeepCurrentValues, objUser)
objUIData.SubmitChanges(ConflictMode.ContinueOnConflict)
Return True
Catch ex As Exception
Throw ex
End Try
End Function
end class
我写这段代码来更新我的数据:
Dim tmpUser As New UI_Class.BAL.Security.cls_SEC_USER
Dim tblUser = tmpUser.GetAll.SingleOrDefault(Function(x) x.DS_OPENID = pOpenID)
tblUser.DT_LAST_LOGIN = DateTime.Now
tmpUser.Update(tblUser)
当我运行它时,我有以下错误消息:无法附加已存在的实体。
如何解决?
答案 0 :(得分:4)
解决此问题的最简单方法是在检索用户对象和更新时使用相同的DataContext。
通常,DataContext应该为“工作单元”保持活动状态,换句话说,您使用它来检索您想要更改的任何对象,然后更改其属性,然后只需对其执行SubmitChanges() DataContext的。无需将实体重新附加到DataContext,因为它已经有了对它的引用。
我的VB技能不存在,但是这样的东西应该可以工作(注意:非常粗略的伪代码出现,建议正确处理DataContext的事情):
class cls_SEC_USER
{
private _UIData = new UIData();
public User SingleOrDefault(int x)
{
return _UIData.Users.SingleOrDefault(y => y.UserId == x);
}
public void Update(User u)
{
_UIData.SubmitChanges();
}
}
// ..........
cls_SEC_USER tmpUser = new cls_SEC_USER();
User u = tmpUser.SingleOrDefault(4);
if(u != null)
{
u.DT_LAST_LOGIN = DateTime.Now;
tmpUser.Update(u);
}
Brian Orrell has a pretty good run-down您遇到的问题,如果您想深入挖掘。
答案 1 :(得分:2)
如果您从中检索用户对象的DataContext尚未断开连接或丢弃,我认为不需要调用Attach()。 objUIData的生命周期是什么?
答案 2 :(得分:0)
我不知道你的问题的答案,我也一直坚持同样的问题,但我采取了一个简单的策略来防止这些小问题。
不是试图附加/分离,而是尽快获取实际对象;这在web场景中非常有效。