为了账号安全,请及时绑定邮箱和手机立即绑定

在实体框架中显式加载嵌套的相关模型

在实体框架中显式加载嵌套的相关模型

C#
互换的青春 2021-04-27 16:09:57
我正在使用EF6开发ASP.NET MVC5项目。我有3个模型:用户,角色和权限。用户和角色之间的关系是多对多的。角色和权限之间的关系是多对多的。LazyLoadingEnabled被禁止在数据库环境。public class Permission{    public int ID { get; set; }    public string Name { get; set; }    public virtual ICollection<Role> Roles { get; set; }}public class Role{    public int ID { get; set; }    public string Name { get; set; }    public virtual ICollection<Permission> Permissions { get; set; }    public virtual ICollection<User> Users { get; set; }}public class User{    public int ID { get; set; }    public string Username { get; set; }    public string DisplayName { get; set; }    public virtual ICollection<Role> Roles { get; set; }}public class TaskManagerDB : DbContext{    public TaskManagerDB() : base()    {        Configuration.LazyLoadingEnabled = false;    }    public DbSet<Role> Roles { get; set; }    public DbSet<Permission> Permissions { get; set; }    public DbSet<User> Users { get; set; }}在较早的时候,我获取了一个给定的用户:User user = db.Users.Find(1);现在:由于我已经有了模型,如何加载具有用户权限的用户角色?我试过了:db.Entry(user).Collection(x => x.Roles).Query().Include(y => y.Permissions).Load();但这不起作用-user.Roles仍在null。以下解决方案是不可接受的,因为我已经有用户模型:User user = db.Users.Include("Roles.Permissions").Where(x => x.ID == 1).FirstOrDefault();
查看完整描述

2 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

你尝试过的


db.Entry(user).Collection(x => x.Roles).Query()

    .Include(y => y.Permissions)

    .Load();

确实是预期的方式。它适用于除隐式联结表的多对多关系以外的所有其他情况,在这里就是这种情况。


我不知道这是错误还是“设计使然”,但是解决方案是解决关系Include的另一端(调用),例如


db.Entry(user).Collection(x => x.Roles).Query()

    .Include(y => y.Users) // <--

    .Include(y => y.Permissions)

    .Load();


查看完整回答
反对 回复 2021-05-08
  • 2 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信