2016-08-07 3 views
1

В настоящее время я экспериментирую с EF, и у меня есть следующая проблема, которую я не могу решить.EF 6.x: Не удается засеять таблицы с отношением «многие ко многим»

У меня есть пользовательские и ролевые объекты со многими отношениями ко многим. Проблема возникает, когда я пытаюсь загрузить базу данных с исходными данными. Два пользователя и две роли (в приведенном ниже коде) посеяны успешно. Я могу видеть записи в таблицах Роли и Пользователи. Но таблица соединений имеет только одну запись с user1 id и с role1 id. Когда я пытаюсь получить пользователя с двумя ролями из db, у него есть только одна роль - role1. И я не знаю почему. Где моя ошибка и как я могу это сделать правильно? Вот мой код:

Entity

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

Пользователь

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

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

Роль

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 код

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

ответ

0

Хорошо, я думаю, я нашел мою проблему. Кажется, мои сравнители, где причина. Я заменил SortedSet<> на общий список, и все началось, как и следовало ожидать.

Вот код одного из моих компараторов:

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

Я до сих пор не могу понять, почему это было причиной моих проблем, так что если кто-то знает, пожалуйста, скажите мне.

 Смежные вопросы

  • Нет связанных вопросов^_^