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
处放置代码断点,那么一切正常,ApplicationUser
有 Roles
并且角色知道 ApplicationUser
。
在数据库本身进行验证时,所有数据都是正确的,并且呈现出应有的样子。但是,当我继续代码并到达控制器时,ApplicationUser
中不存在任何 (User)Roles,但 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
}
用户角色
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 开发人员,他努力编辑我的问题并格式化我问题中的 类。
所以我确定这是一个我忽略的愚蠢错误,但我找不到它。
我正在尝试映射与 Entity Framework 的多对多关系,但是虽然在初始化程序中一切正常,但 Role
属性只有 return 一个新的空列表而不加载数据来自数据库。
如果我在 DataInitializer
处放置代码断点,那么一切正常,ApplicationUser
有 Roles
并且角色知道 ApplicationUser
。
在数据库本身进行验证时,所有数据都是正确的,并且呈现出应有的样子。但是,当我继续代码并到达控制器时,ApplicationUser
中不存在任何 (User)Roles,但 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
}
用户角色
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 开发人员,他努力编辑我的问题并格式化我问题中的 类。