Так что я уверен, что это глупая ошибка, которую я упустил, но я не могу ее найти. Я пытаюсь сопоставить отношения «многие ко многим» с Entity Framework, но, хотя в инициализаторе все работает успешно, атрибуты Role
возвращают только новый пустой список без загрузки данных из базы данных.
Если я поставлю точку останова в коде DataInitializer
, то все будет работать, ApplicationUser
имеет Roles
, а роли знают ApplicationUser
.
При проверке в самой базе данных все данные верны и представляют, как это должно быть. Однако, когда я продолжаю код и прихожу к контроллеру, то в ApplicationUser
роли (пользователя) нет, а в Roles
нет UserRoles
.
У меня есть Role
, UserRole
и ApplicationUser
, и отношение многих ко многим отображено в моем UserRoleConfiguration
.
public class UserRepository : IUserRepository
{
private readonly ApplicationDbContext _context;
private readonly DbSet<ApplicationUser> _users;
public UserRepository(ApplicationDbContext context)
{
_context = context;
_users = context.ApplicationUser;
}
public ApplicationUser GetByMailAndPassword(string email, string password)
{
return _users.Include(i => i.Role).FirstOrDefault(u => u.Email == email && u.Password == password);
}
public ApplicationUser GetByUsernameAndPassword(string username, string password)
{
return _users.Include(i => i.Role).FirstOrDefault(u => u.UserName == username && u.Password == password);
}
public void NewUser(ApplicationUser user)
{
_users.Add(user);
}
public void SaveChanges()
{
_context.SaveChanges();
}
}
Роль
public class Role
{
public int Id { get; set; }
public RoleEnums RoleEnum {get; set;}
public ICollection<UserRole> UserRoles { get; set; }
public Role(RoleEnums role)
{
RoleEnum = role;
UserRoles = new List<UserRole>();
}
}
public enum RoleEnums
{
User,
Responsable,
Mainresponsable
}
UserRole
public class UserRole
{
public int ApplicationUserId { get; set; }
public ApplicationUser User { get; set; }
public int RoleId { get; set; }
public Role Role { get; set; }
protected UserRole()
{
}
public UserRole(ApplicationUser user, Role role) : this()
{
User = user;
ApplicationUserId = User.Id;
Role = role;
RoleId = Role.Id;
}
}
ApplicationUser
public class ApplicationUser
{
#region Properties
public int Id { get; set; }
public ICollection<UserRole> Role { get; private set; }
#endregion
#region Constructor
public ApplicationUser()
{
Role = new HashSet<UserRole>();
}
public bool ContainsRole(RoleEnums role)
{
return Role.Any(r => r.Role.RoleEnum == role);
}
#endregion
}
UserRoleConfiguration
public class UserRoleConfiguration : IEntityTypeConfiguration<UserRole>
{
public void Configure(EntityTypeBuilder<UserRole> builder)
{
builder.ToTable("UserRoles");
builder.HasKey(k => new { k.RoleId, k.ApplicationUserId });
builder.HasOne(k => k.Role).WithMany(k => k.UserRoles).HasForeignKey(k => k.RoleId).IsRequired().OnDelete(DeleteBehavior.Cascade);
builder.HasOne(k => k.User).WithMany(k => k.Role).HasForeignKey(k => k.ApplicationUserId).IsRequired().OnDelete(DeleteBehavior.Cascade);
}
}
UserConfiguration
public class UserConfiguration : IEntityTypeConfiguration<ApplicationUser>
{
public void Configure(EntityTypeBuilder<ApplicationUser> builder)
{
builder.ToTable("User");
builder.HasKey(u => u.Id);
builder.HasMany(u => u.Role).WithOne(u => u.User).HasForeignKey(u => u.ApplicationUserId);
}
}
RoleConfiguration
public class RoleConfiguration : IEntityTypeConfiguration<Role>
{
public void Configure(EntityTypeBuilder<Role> builder)
{
builder.ToTable("Roles");
builder.HasKey(r => r.Id);
builder.HasMany(e => e.UserRoles).WithOne(e => e.Role).HasForeignKey(e => e.RoleId);
}
}