2009-06-17 7 views
3

J'ai un modèle relationnel avec une table associative. Mais en plus des clés associées, cette table a également un drapeau. Je voudrais définir deux associations: une où le drapeau est vrai et l'autre où c'est faux. Le concepteur EF peut ajouter une condition à une entité, mais pas à une association.Dans Entity Framework, comment spécifier une condition sur une association?

Le tableau associatif ressemble à ceci:

UserPrivilege 
------------- 
UserId int (FK1) 
PrivilegeId int (FK2) 
IsGranted bit 

Je voudrais créer deux associations entre l'entité utilisatrice et l'entité Privilège: PrivilegesGranted et PrivilegesDenied.

Répondre

2

Vous ne pouvez pas le faire directement via le concepteur.

Mais cela est possible dans le XML en utilisant DefiningQuery et créer et supprimer des sprocs. Voir cet ancien poste sur mon blog pour plus d'informations: Associations with Payloads. La seule chose qui est un peu intéressante est je suppose que le PK est juste UserId et PrivilegeId, ce qui signifie qu'un utilisateur ne peut pas être accordé et refusé pour un privilège particulier en même temps.

Donc, si vous écrivez du code comme ceci:

Privilege p = user.Granted.First(); 
user.Granted.Remove(p); 
user.Denied.Add(p); 
ctx.SaveChanges(); 

commande de mise à jour est important. parce que vous utilisez un DefiningQuery pour les deux associations, l'EF ne sait pas qu'ils sont liés et qu'il doit effectuer la suppression avant de pouvoir effectuer la mise à jour. Par conséquent, vous pourriez vous retrouver avec des violations PK. Une manière de résoudre ce problème est dans les sprocs d'insertion et de suppression pour chaque association, vous pouvez essentiellement les faire changer la ligne actuelle pour la paire utilisateur et privilège, si elle existe, mettez-la à jour avec la valeur IsGranted correcte, sinon créez-le, c'est-à-dire, faites-en une surenchère.

Permettez-moi de savoir comment vous allez ici

Alex

Questions connexes