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

Posted

技术标签:

【中文标题】在实体框架中显式加载嵌套的相关模型【英文标题】:Explicit Loading nested related models in Entity Framework 【发布时间】:2018-10-02 17:47:48 【问题描述】:

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

【问题讨论】:

【参考方案1】:

你尝试了什么

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();

【讨论】:

【参考方案2】:

获取用户角色和权限的一种方式:

db.Roles.Include("Permissions").Where(r => r.Users.Select(u => u.ID).Contains(user.ID));

【讨论】:

以上是关于在实体框架中显式加载嵌套的相关模型的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 OpenGL 中显式管理矩阵更好?

在另一个 SBT 插件中显式启用 SBT 插件

从Aurelia依赖注入容器中显式请求新实例

在 terraform 模块中显式使用提供程序

实体框架6代码首先用oracle更新实体

为啥在 Haskell 中显式推导 Show/Read?