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

我正在使用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();



互换的青春
浏览 116回答 2
2回答

MMTTMM

你尝试过的db.Entry(user).Collection(x => x.Roles).Query()&nbsp; &nbsp; .Include(y => y.Permissions)&nbsp; &nbsp; .Load();确实是预期的方式。它适用于除隐式联结表的多对多关系以外的所有其他情况,在这里就是这种情况。我不知道这是错误还是“设计使然”,但是解决方案是解决关系Include的另一端(调用),例如db.Entry(user).Collection(x => x.Roles).Query()&nbsp; &nbsp; .Include(y => y.Users) // <--&nbsp; &nbsp; .Include(y => y.Permissions)&nbsp; &nbsp; .Load();
打开App,查看更多内容
随时随地看视频慕课网APP