2008-12-12 49 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場景中運行得很好。