2016-08-07 30 views
1

Ich experimentiere gerade mit EF und habe folgendes Problem, das ich nicht lösen kann.EF 6.x: Tabellen können nicht mit einer Viele-zu-Viele-Beziehung erstellt werden

Ich habe User und Rolle Entitäten mit Viele-zu-viele-Beziehung. Das Problem tritt auf, wenn ich versuche, die Datenbank mit Anfangsdaten zu initialisieren. Zwei Benutzer und zwei Rollen (im folgenden Code) werden erfolgreich platziert. Ich kann Einträge in Rollen und Benutzer Tabellen sehen. Aber Junction-Tabelle hat nur einen Eintrag mit user1 id und mit role1 id. Wenn ich versuche, Benutzer mit 2 Rollen aus db zu bekommen, hat es nur eine Rolle - role1. Und ich weiß nicht warum. Wo ist mein Fehler und wie kann ich das richtig machen? Hier ist mein Code:

Entity

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

Benutzer

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

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

Rolle

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 
    } 
} 

Seed Code

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); 
    } 
} 

Antwort

0

Ok, ich glaube, ich mein Problem gefunden habe. Es scheint, dass meine Comparer die Ursache waren. Ich ersetzte SortedSet<> durch generische Liste, und alles begann wie erwartet zu arbeiten. Hier

ist der Code eines meines comparers:

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

Ich kann immer noch nicht ganz verstehen, warum es meine Probleme verursacht wurde, so dass, wenn jemand weiß, bitte, sagen Sie mir.