如何使用Linq按附加方法更新数据

时间:2008-12-12 17:42:44

标签: asp.net linq

我的数据层中有一个更新方法,如下所示:

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)

当我运行它时,我有以下错误消息:无法附加已存在的实体。

如何解决?

3 个答案:

答案 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场景中非常有效。