2010-08-31 4 views
4

j'ai 3 tables -Entity Framework 4 many to many mise à jour

User (Id, Name) 
Roles (Id, Name) 
UserRoles (UserId, RoleId) 

Je pense qu'ils sont explicites. Comment mettre à jour une entrée (UserId et RoleId) dans UserRoles?

context.User.Roles donne la liste des rôles mais comment les mettre à jour?

Merci.

+0

Il y a eu une question similaire ici: http://stackoverflow.com/questions/1732609/how-do--create-and-update-a-many-to-many-relationship-with-ef – Yakimych

+0

link dit "charger l'objet désiré, définir les propriétés modifiées et appeler SaveChanges sur le contexte." context.User.Roles me donne la liste des rôles. Je peux faire un pour-chacun et mettre à jour l'Id, mais comment puis-je mettre à jour le UserId foreach RoleId correspondant dans cette table? – tempid

+0

Quelqu'un? Ça me rend fou. – tempid

Répondre

6

De votre commentaire:

context.User.Roles me donne la liste des rôles. Je peux faire un pour-chacun et mettre à jour l'Id, mais comment puis-je mettre à jour le correspondant UserId foreach RoleId dans cette table?

Tout d'abord, vous ne devez PAS mettre à jour les ID. Ensuite, puisque vous utilisez EF, vous devriez essayer de penser en termes d'objets (ou d'entités), plutôt que de "tables DB-many-to-many-mapping". Chaque entité User a une collection de Roles. Si vous supprimez un Role de la collection User.Roles et appelez context.SaveChanges(), l'entrée correspondante sera supprimée de la tabelle UserRoles. De même, lorsque vous ajoutez un objet Role à la collection User.Roles et enregistrez les modifications, une nouvelle entrée est créée dans la table UserRoles.
L'exemple suivant pourrait être utile pour la clarté:

var user = context.Users.Include("Roles").Where(u => u.Name == "User1").FirstOrDefault(); 
user.Roles.Remove(user.Roles.Where(r => r.Name == "Admin").FirstOrDefault()); 
context.SaveChanges(); 

(contrôles NULL référence omis pour simplifier).

+0

Merci pour votre réponse. J'ai appris que je dois supprimer complètement l'enregistrement de la table de jointure et en ajouter un nouveau au lieu d'essayer de mettre à jour l'enregistrement existant. De plus, j'avais besoin d'avoir UserId et RoleId comme une clé composite dans la table de jointure pour que cela fonctionne. – tempid