我的数据层中有一个这样的更新方法:
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)
当我运行它时,出现以下错误消息:无法附加已存在的实体。
如何修复?
最佳答案
解决此问题的最简单方法是在检索用户对象和更新时使用相同的 DataContext。
一般来说,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如果您想深入挖掘,请查看您遇到的问题。
关于asp.net - 如何通过 Attach 方法使用 Linq 更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/363570/