繁体   English   中英

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

[英]Explicit Loading nested related models in Entity Framework

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

你尝试过的

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM