Хорошо, я наконец понял это, на случай, если кому-то интересно. Он не может правильно сопоставить роли, потому что ApplicationDBContext наследует неправильную конфигурацию модели IdentityDbContext. Для этого вы должны создать свой собственный класс, который наследует IdentityUserRole и реализовать соответствующий IdentityDBContext.
public partial class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string, IdentityUserClaim<string>, ApplicationUserRole, IdentityUserLogin<string>, IdentityRoleClaim<string>, IdentityUserToken<string>>
Где ApplicationUser, ApplicationRole и ApplicationUserRole - ваши пользовательские классы.
public class ApplicationUserRole : IdentityUserRole<string>
{
public ApplicationUserRole() : base()
{
}
public virtual ApplicationUser User { get; set; }
public virtual ApplicationRole Role { get; set; }
}
По какой-то причине EF пытался сгенерировать дополнительные столбцы "UserId1
" и "RoleId1
", чтобы избежать этого, я просто дал указание модели взять наследование IdentityUserRole, убедитесь, что ваши свойства Id соответствуют типу TKey.
Тогда я смог правильно оценить роли. Затем, чтобы получить отображение, я добавил следующее к ApplicationUser
и ApplicationRole
классам:
public virtual ICollection<ApplicationUserRole> UserRoles { get; set; }
Теперь, чтобы отобразить новые сущности, я добавил следующее в modelBuilder:
modelBuilder.Entity<ApplicationUserRole>(entity =>
{
entity.HasOne(e => e.Role)
.WithMany(e => e.UserRoles)
.HasForeignKey(e => e.RoleId);
entity.HasOne(e => e.User)
.WithMany(e => e.UserRoles)
.HasForeignKey(e => e.UserId);
});
Все просто, не включайте никакую конфигурацию в ApplicationUser или ApplicationRole, поскольку IdentityDBContext будет обрабатывать это должным образом.
Теперь вы можете включать / присоединять цепочку, чтобы получить действительный класс ApplicationRole
вместо IdentityRole<TKey>
Например:
var list = _context.Users.Include(u => u.UserRoles).ThenInclude(ur => ur.Role).ToList();
Подвести итог:
- Указать правильный экземпляр IdentityDBContext
- Создать сущность таблицы соединений ApplicationUserRole
- Настройка виртуальных свойств для сопоставления ApplicationUser и ApplicationRole
- Настройка виртуальных свойств для сопоставления RoleId и UserId, совпадающих с TKey
- Создание сопоставления сущностей с помощью построителя моделей, но оставление только сущности ApplicationUser / ApplicationRole