请参阅here和here了解相同的基本问题 - 这个问题更进了一步。
所以我首先使用DB(MySql,Pomelo EFCore框架)到.NET Core项目中的用户表,角色表和用户用户(连接)表的自定义用户数据库。我已经设置了我的EF类来处理如here所述的多对多关系:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//user and roles table omitted for brevity
modelBuilder.Entity<Userroles>(entity =>
{
entity.HasKey(r => new { r.UserId, r.RoleId });
entity.HasOne(ur => ur.User)
.WithMany(u => u.UserRoles)
.HasForeignKey(ur => ur.UserId);
entity.HasOne(ur => ur.Role)
.WithMany(r => r.UserRoles)
.HasForeignKey(ur => ur.RoleId);
});
}
我的相应课程是这些:
public partial class Users
{
[Key]
public int ID { get; set; }
//lots of properties
public List<Userroles> UserRoles { get; set; }
}
public class Roles
{
[Key]
public int RoleId { get; set; }
public string RoleName { get; set; }
public List<Userroles> UserRoles { get; set; }
}
public partial class Userroles
{
[ForeignKey("Users")]
public int UserId { get; set; }
public Users User { get; set; }
[ForeignKey("Roles")]
public int RoleId { get; set; }
public Roles Role { get; set; }
}
当我尝试加载具有角色的用户时,最初会出现问题。
执行此操作会向用户返回附加的用户规则列表,但每个userrole中的Role属性为null:
var user = db.Users.Where(user => user.Sid == userName).Include(u => u.UserRoles).FirstOrDefault()
如果我在执行上述操作之前调用db.Roles.Load();
,则会根据其Role属性正确填充userroles。
所以问题是 - 这是完成加载多对多导航属性的最佳方法吗?或者是否有更好的方式我不必先调用db.Roles.Load();
?
编辑: 这是加载相关数据的MS doc。我尝试了几种不同的方法来处理.ThenInclude(x =&gt; x.whatever),但没有成功。例如,我试过这个:
var user = db.Users.Include(u => u.UserRoles).ThenInclude(u => u.Select(ur => ur.Role)).Where(user => user.Sid == userName).FirstOrDefault();
引发:
System.ArgumentException:属性表达式'u =&gt; {从 用户自己选择[ur] .Role}'无效。表达方式 应代表属性访问:'t =&gt; t.MyProperty”。
我尝试做的是包含给定用户的userRoles列表。