EF Core加载没有.load()的嵌套导航属性?

时间:2017-03-08 19:09:27

标签: entity-framework asp.net-core

请参阅herehere了解相同的基本问题 - 这个问题更进了一步。

所以我首先使用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列表。

0 个答案:

没有答案