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