在实体框架中显式加载嵌套的相关模型
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));
【讨论】:
以上是关于在实体框架中显式加载嵌套的相关模型的主要内容,如果未能解决你的问题,请参考以下文章