Entity Framework 6.4 - отношение многие ко многим возвращает новый пустой список вместо данных - PullRequest
0 голосов
/ 14 марта 2020

Так что я уверен, что это глупая ошибка, которую я упустил, но я не могу ее найти. Я пытаюсь сопоставить отношения «многие ко многим» с 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);
    }
}

1 Ответ

0 голосов
/ 23 марта 2020

Тем временем нашёл ответ, репозиторий не был правильно сконфигурирован с помощью include и ThenInclude.

    return _users.Include(i => i.Role).ThenInclude(i => i.Role)
        .FirstOrDefault(u => u.Email == email && u.Password == password);

Отдельное спасибо старшему ASP. NET разработчику, который приложил усилия к отредактируйте мой вопрос и отформатируйте классы в моем вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...