2008-12-12 53 views
3

我有一个更新的方法在我的数据层从而使得这样的:如何更新数据使用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) 

当我运行它,我有这个错误消息:不能附加一个已经存在的实体。

如何解决?

回答

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那你正在经历,如果你想深入挖掘。

2

如果您从中检索到用户对象的DataContext尚未断开或处置,我不认为需要调用Attach()。 objUIData的生命周期是什么?

+0

尝试将从一个DataContext创建的对象附加到另一个时,会发生此错误。 – leppie 2008-12-12 17:48:07

0

我不知道你的问题的答案,我一直在同样的问题,但我采取了一个简单的策略,以防止这些小问题。

而不是尝试附加/分离,尽快获取实际的对象;这在web场景中运行得很好。