Asp.net 实体框架6.4-多对多关系返回新的空列表而不是数据
所以我肯定这是一个愚蠢的错误,我忽略了,但我找不到它。 我正在尝试映射实体框架的多对多关系,但是当初始化器中的一切都成功运行时,Asp.net 实体框架6.4-多对多关系返回新的空列表而不是数据,asp.net,entity-framework-6,Asp.net,Entity Framework 6,所以我肯定这是一个愚蠢的错误,我忽略了,但我找不到它。 我正在尝试映射实体框架的多对多关系,但是当初始化器中的一切都成功运行时,角色属性只返回一个新的空列表,而不从数据库加载数据 如果我在数据初始值设定项处放置一个断点,则一切正常,应用程序用户具有角色,角色知道应用程序用户 当在数据库本身中进行验证时,所有数据都是正确的,并且显示了它应该是怎样的。但是,当我继续代码并到达控制器时,ApplicationUser中不存在(用户)角色,而UserRoles中也不存在UserRoles 我有一个角色、
角色
属性只返回一个新的空列表,而不从数据库加载数据
如果我在数据初始值设定项
处放置一个断点,则一切正常,应用程序用户
具有角色
,角色知道应用程序用户
当在数据库本身中进行验证时,所有数据都是正确的,并且显示了它应该是怎样的。但是,当我继续代码并到达控制器时,ApplicationUser
中不存在(用户)角色,而UserRoles
中也不存在UserRoles
我有一个角色
、用户角色
和应用程序用户
,多对多关系映射到我的用户角色配置
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 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
}
公共类应用程序用户
{
#区域属性
公共int Id{get;set;}
公共ICollection角色{get;private set;}
#端区
#区域构造函数
公共应用程序用户()
{
Role=newhashset();
}
公共bool ContainsRole(RoleEnums角色)
{
返回Role.Any(r=>r.Role.RoleEnum==Role);
}
#端区
}
用户角色配置
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);
}
}
公共类UserRoleConfiguration:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
builder.ToTable(“用户角色”);
HasKey(k=>new{k.RoleId,k.applicationserid});
HasOne(k=>k.Role).WithMany(k=>k.UserRoles).HasForeignKey(k=>k.RoleId).IsRequired().OnDelete(DeleteBehavior.Cascade);
HasOne(k=>k.User).WithMany(k=>k.Role).HasForeignKey(k=>k.applicationserid).IsRequired().OnDelete(DeleteBehavior.Cascade);
}
}
用户配置
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);
}
}
公共类用户配置:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
建造商。可转让(“用户”);
builder.HasKey(u=>u.Id);
builder.HasMany(u=>u.Role).WithOne(u=>u.User).HasForeignKey(u=>u.applicationserid);
}
}
角色配置
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);
}
}
公共类角色配置:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
建造商。可转让(“角色”);
HasKey(r=>r.Id);
builder.HasMany(e=>e.UserRoles).WithOne(e=>e.Role).HasForeignKey(e=>e.RoleId);
}
}
同时找到了答案,存储库没有正确配置include和include
return _users.Include(i => i.Role).ThenInclude(i => i.Role)
.FirstOrDefault(u => u.Email == email && u.Password == password);
特别感谢高级ASP.NET开发人员,他花了很大的精力编辑了我的问题并格式化了我问题中的类