2016-08-07 1 views
1

J'expérimente actuellement avec EF et j'ai un problème suivant que je ne peux pas résoudre.EF 6.x: Impossible de graver des tables avec une relation plusieurs-à-plusieurs

J'ai des entités Utilisateur et Rôle avec une relation plusieurs-à-plusieurs. Le problème apparaît quand j'essaye de graver la base de données avec les données initiales. Deux utilisateurs et deux rôles (dans le code ci-dessous) sont plantés avec succès. Je peux voir les entrées dans les tables Rôles et Utilisateurs. Mais la table de jonction a une seule entrée avec user1 id et avec role1 id. Quand j'essaye d'obtenir l'utilisateur avec 2 rôles de DB, il a seulement un rôle - role1. Et je ne sais pas pourquoi. Où est mon erreur et comment puis-je le faire correctement? Voici mon code:

Entité

public abstract class Entity 
{ 
    public int Id { get; set; } 
} 

utilisateur

public class AppUser : Entity 
{ 
    ... 
    public virtual ICollection<AppRole> Roles { get; set; } 

    public AppUser() 
    { 
     Roles = new SortedSet<AppRole>(new RoleComparer()); 
    } 
} 

Rôle

public class AppRole : Entity 
{ 
    public RoleEnum Role { get; set; } 
    public ICollection<AppUser> Users { get; set; } 
    public AppRole() 
    { 
     Users = new SortedSet<AppUser>(new UserComparer()); 
    } 
} 

FluentAPI

public class UserMap : EntityTypeConfiguration<AppUser> 
{ 
    public UserMap() 
    { 
     ToTable("Users"); 
     ... 
     #region Many-to-Many 
     HasMany(usr => usr.Roles) 
       .WithMany(r => r.Users) 
       .Map(map => 
       { 
        map.ToTable("UsersAndRoles"); 
        map.MapLeftKey("AppUserId"); 
        map.MapRightKey("AppRoleId"); 
       }); 
     #endregion 
    } 
} 

Code des semences

public class DropCreateTestDbAlways : DropCreateDatabaseAlways<UnitTestContext> 
{ 
    protected override void Seed(UnitTestContext context) 
    { 
     var role1 = new AppRole(); 
     var role2 = new AppRole() { Role = RoleEnum.Administrator }; 
     context.Roles.Add(role1); 
     context.Roles.Add(role2); 

     var user1 = new AppUser() 
     { 
      UserName = "RegularUser", 
      Email = "[email protected]", 
      PasswordHash = "FGJSDBXNLSNLSDDSJSCLNCS", 
      UserProfile = new AppUserProfile() 
     }; 
     var user2 = new AppUser() 
     { 
      UserName = "AdminUser", 
      Email = "[email protected]", 
      PasswordHash = "FGJSDBXNLSNLSDDSJSCLNCS", 
      UserProfile = new AppUserProfile() 
     }; 

     user1.Roles.Add(role1); 
     user2.Roles.Add(role1); 
     user2.Roles.Add(role2); 

     context.Users.Add(user1); 
     context.Users.Add(user2); 
     base.Seed(context); 
    } 
} 

Répondre

0

Ok, je pense que j'ai trouvé mon problème. Il semble que mes comparateurs sont la cause. J'ai remplacé SortedSet<> avec liste générique, et tout a commencé à fonctionner comme prévu.

Voici le code d'un de mes comparateurs:

public class RoleComparer : IComparer<AppRole> 
{ 
    public int Compare(AppRole x, AppRole y) 
    { 
     return x.Id.CompareTo(y.Id); 
    } 
} 

Je ne peux toujours pas tout à fait comprendre pourquoi il était à l'origine de mes problèmes, donc si quelqu'un sait, s'il vous plaît, dites-moi.