【问题标题】:EF Include and ThenIncludeEF 包含和 ThenInclude
【发布时间】:2020-01-29 23:42:29
【问题描述】:

我有几个模型正在尝试与 Include 绑定,它没有返回所有预期的相关数据。完整的链条是:

用户(一)> 角色(一)> 权限(多)> 实体(一)> EntityArea(一)

这些是我的模型:(CompanyBase 是一个带有 companyId 的基类)

public class User : _CompanyBase
    {
        public int UserID { get; set; }
        public string FullName { get; set; }

        public int RoleID { get; set; }
        public Role Role { get; set; }
    }


 public class Role : _CompanyBase
    {
        [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int RoleID { get; set; }

        [Required]
        [StringLength(100, MinimumLength = 3)]
        public string Name { get; set; }

        public ICollection<RolePermission> RolePermissions { get; set; }

        public ICollection<User> Users { get; set; }
    }


 public class RolePermission : _CompanyBase
    {
        [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int RolePermissionID { get; set; }
        public Guid Id { get; set; }

        [Required]
        [StringLength(100, MinimumLength = 3)]
        public string PermissionCode { get; set; }



        public int RoleID { get; set; }
        public Role Role { get; set; }



        public int EntityID { get; set; }
        public Entity Entity { get; set; }


    }

public class Entity : _CompanyBase
    {
        [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int EntityID { get; set; }

        [Required]
        [StringLength(100, MinimumLength = 3)]
        public string DisplayName { get; set; }


        public int EntityAreaID { get; set; }

        public EntityArea EntityArea { get; set; }


    }

public class EntityArea :_CompanyBase
    {
        [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int EntityAreaID { get; set; }

        [Required]
        [StringLength(50, MinimumLength = 3)]
        public string Name { get; set; }


        public ICollection<Entity> Entities { get; set; }
    }

我正在尝试将它们绑定:

dbUser = db.Users
                    .AsNoTracking()
                    .Where(x => x.UserId == UserID)
                    .Include(m => m.Role)
                    .ThenInclude(m => m.RolePermissions)
                    .ThenInclude(m => m.Entity)
                    .ThenInclude(m => m.EntityArea)
                    .FirstOrDefault();

但是,我确实得到了角色,我没有得到任何进一步的东西(角色权限集合、实体和区域)。从根本上说我做错了什么吗?这是一个只读查询,因此使用了 nottracking。

谢谢!

【问题讨论】:

  • 只是猜测,但是制作ICollectionvirtual不会改变结果吗?
  • 嗯,我会试试看,但不会把它变成虚拟的,只是把它改成延迟加载而不是急切?
  • 你可能是对的,但如果你不想延迟加载,this.Configuration.LazyLoadingEnabled = false; 可以全局禁用它。
  • 或者我们正在谈论不同的 EF 版本。是 EF Core 还是 EF 6 及以下?
  • 这是 EF Core

标签: entity-framework


【解决方案1】:

我认为您的尝试没有任何根本性的错误。您是否检查过特定用户在连接的表中是否确实有任何数据?

Include() 有时会在您不需要时生成左连接,因此我建议您尽可能远离它。我通常会使用投影来指定我想要接收的数据。对于您的示例,可以通过以下方式完成:

    dbUser = db.Users
                        .AsNoTracking()
                        .Where(x => x.UserId == UserID)
                        .Select(x => new 
                        {
                          Role = x.Role,
                          RolePermissions = x.RolePermissions,
                          Entity = x.Entity,
                          EntityArea = x.EntityArea
                        })
                        .FirstOrDefault();

【讨论】:

  • 是的,我检查了两次和三次以查看相关数据是否正确存在......非常确定它确实存在(我猜我;;再检查一次)。有什么理由 include 和 theninclude 不会返回预期的数据呢?看来“这应该可行”
  • 您可以使用以下命令检查您的 LINQ 生成的 SQL 类型:“context.Database.Log = Console.WriteLine;” (或者您可以将其设置为仅将 SQL 连接到本地字符串变量的 lambda)之后,您可以在 SQL Developer/Management Studio 中运行它,以检查查询的哪个部分使其没有结果。之后你有几个选择:1)调整 LINQ 查询几次,直到它产生你需要的 SQL 或 2)使用纯 SQL 而不是 EF
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2021-04-21
  • 2018-01-21
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
相关资源
最近更新 更多