c# - 在 Entity Framework 中显式加载嵌套相关模型

标签 c# asp.net-mvc-5 entity-framework-6

我正在使用 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/

相关文章:

c# - Visual Studio 2013.3 中新 MVC5 项目的错误

c# - UserManager.SendEmailAsync 挂起

c# - 可能由 Nuget 包引起的 Visual Studio 2013 错误?

c# - WPF 文本框中的必填字段验证

c# - MVC 4 默认参数值

c# - 如何将所有记录合并为 2 条记录并删除所有未合并的记录?

c# - App_Code 中的 SignalR Hub 导致 "Two Hubs must not share the same name"错误

c# - 具有外部源的 Entity Framework 6 同步表

c# - 如何使用 Entity Framework 和 Moq 进行单元测试?

c# - 'Y' 中的实体参与 'FK_Y_X' 关系。找到 0 个相关的 'X'。预计 1 'X'