我正在使用 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
。
以下解决方案是 Not Acceptable ,因为我已经有了用户模型:
User user = db.Users.Include("Roles.Permissions").Where(x => x.ID == 1).FirstOrDefault();
最佳答案
你做过什么
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();
关于c# - 在 Entity Framework 中显式加载嵌套相关模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49968247/