В настоящее время я экспериментирую с 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);
}
}