2008-12-12 5 views
3

J'ai une méthode de mise à jour dans ma couche de données telles ceci:Comment mettre à jour les données avec LINQ par méthode Attach

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 

Et j'écris ce code pour mettre à jour mes données:

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) 

Quand je exécutez-le, j'ai ce message d'erreur: Impossible de joindre une entité qui existe déjà.

Comment peut-il être fixé?

Répondre

4

La manière la plus simple de contourner ce problème consiste à utiliser le même DataContext lors de la récupération de l'objet utilisateur et de la mise à jour. En général, un DataContext doit être maintenu actif pour une "unité de travail", en d'autres termes, vous l'utilisez pour récupérer l'objet que vous voulez changer, puis changez ses propriétés, et ensuite seulement SubmitChanges() sur le DataContext. Il n'est pas nécessaire de rattacher l'entité au DataContext, car elle contient déjà une référence à celle-ci.

Mes compétences VB sont pas existants, mais quelque chose comme cela devrait fonctionner (note: code pseudo très brut à venir, des choses comme l'élimination adéquate des DataContext est recommandé):

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 des questions vous vivez, si vous voulez creuser plus profondément.

2

Si le DataContext que vous avez extrait de l'objet utilisateur n'a pas été déconnecté ou supprimé, je ne pense pas qu'il soit nécessaire d'appeler Attach(). Quel est le cycle de vie d'objUIData?

+0

Cette erreur se produit également lorsque vous essayez de joindre un objet créé à partir d'un DataContext à un autre. – leppie

+0

Je mets objUIData maintenant;) – mavera

+0

Tant que datalayerSec_User est toujours là, vous n'aurez pas besoin d'attacher. Les mises à jour auront lieu si vous avez activé le suivi des modifications (par défaut je pense) et tout ce que vous avez à faire est d'appeler les modifications de soumission. –

0

Je ne connais pas la réponse à votre question, et j'ai été coincé avec le même problème aussi, mais j'ai adopté une stratégie simple pour éviter ces petits problèmes. Au lieu d'essayer d'attacher/se détacher, chercher l'objet réel dès que possible; Cela fonctionne très bien dans les scénarios web.

Questions connexes