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