实体框架6.4-多对多关系返回新的空列表而不是数据



所以我确信这是一个我忽略的愚蠢错误,但我找不到它。我正试图用Entity Framework映射多对多关系,但当初始化器中的所有内容都能成功工作时,Role属性只返回一个新的空列表,而没有从数据库加载数据。

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

当在数据库中进行验证时,所有数据都是正确的,并显示出它应该是什么样子。但是,当我继续代码并到达控制器时,ApplicationUser中不存在(用户(角色,但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和TheIninclude。

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

特别感谢资深ASP.NET开发人员,他为编辑我的问题和格式化问题中的类付出了努力。

最新更新