Entity Framework 6.4 - 多对多关系 returns 新的空列表而不是数据

Entity Framework 6.4 - many to many relation returns new empty List instead of data

所以我确定这是一个我忽略的愚蠢错误,但我找不到它。 我正在尝试映射与 Entity Framework 的多对多关系,但是虽然在初始化程序中一切正常,但 Role 属性只有 return 一个新的空列表而不加载数据来自数据库。

如果我在 DataInitializer 处放置代码断点,那么一切正常,ApplicationUserRoles 并且角色知道 ApplicationUser

在数据库本身进行验证时,所有数据都是正确的,并且呈现出应有的样子。但是,当我继续代码并到达控制器时,ApplicationUser 中不存在任何 (User)Roles,但 Roles 中也不存在 UserRoles

我有 RoleUserRoleApplicationUser,多对多关系映射到我的 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
}

用户角色

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

应用程序用户

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
}

用户角色配置

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

用户配置

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

角色配置

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

同时找到了答案,存储库没有正确配置 include 和 ThenInclude。

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

特别感谢高级 ASP.NET 开发人员,他努力编辑我的问题并格式化我问题中的 类。