2010-07-10 3 views
2

J'utilise ADO.net Entity Data model pour travailler avec la base de données.La mise à jour ne fonctionne pas dans l'entité ADO.net Modèle de données

Dans mon programme, je veux mettre à jour un enregistrement de la table utilisateur, donc j'utilise le code ci-dessous pour le faire.

Cette fonction permet d'envoyer des informations utilisateur modifiées, puis d'écraser les informations avec les informations utilisateur actuelles.

Après avoir exécuté objUser = _user;, puis appelez objContext.SaveChanges(); pour enregistrer les modifications. Mais quand je fais cela, les changements ne sont pas conservés dans la base de données. J'utilise ce code pour d'autres programmes mais dans ce cas le code ne fonctionne pas!

public void Update(tbLiUser _user) 
{ 
    LinkContext objContext = this.Context; 

    tbLiUser objUser = objContext.tbLiUsers.First(u => u.tluId == _user.tluId); 
    objContext.Attach(objUser); 
    objUser = _user; 

    objContext.SaveChanges(); 
} 

Répondre

2

Tout d'abord, si vous récupérez déjà objUser du objContext, il n'y a vraiment pas de point de joindre cet utilisateur au contexte juste après le récupérer. Donc, je laisserais tomber cette ligne ici entièrement:

objContext.Attach(objUser); 

aussi - vous pourriez mettre à jour le objUser sur une base par propriété des valeurs _user au lieu d'assigner l'objet entier.

Pour vous aider à éviter beaucoup de code fastidieux, vous pouvez utiliser quelque chose comme AutoMapper pour vous permettre d'affecter des propriétés d'un type d'objet à l'autre. Ou vous pouvez créer une routine intelligente qui comparerait les deux objUser et _user et mettre à jour uniquement les propriétés sur objUser qui sont en fait différentes des valeurs dans _user - ne devrait pas être trop difficile de créer cette méthode:

objUser.UpdateValuesFromOtherUser(_user); 
objContext.SaveChanges(); 
+0

objUser et _user sont des handles pour les objets. Lorsque vous trouvez objUser, vous trouvez un objet, assignant son handle à objUser, et l'ajoutant à votre contexte. Lorsque vous dites alors objUser = _user, vous ne mettez pas à jour l'objet, vous pointez simplement la variable vers un objet différent. Le contexte pointe toujours vers l'ancien objet. Comme le dit marc_s, vous devez copier les propriétés une par une, ou peut-être y-a-t-il un raccourci pour les copier "en masse", mais le point est que vous devez mettre à jour l'objet existant et non le réassigner. – Jay

Questions connexes