【发布时间】:2022-11-02 20:35:58
【问题描述】:
我们正在使用 .NET 6 和 EF Core 6 以及现有的 SQL Server 数据库构建应用程序。我们使用数据库优先方法并运行 Scaffold-DbContext 工具,我们能够生成 dbcontex 类。一切正常,两个表之间的父子关系的一部分:
脚手架工具,为上面的表格生成了以下两个类:
public partial class TreeNode
{
public TreeNode()
{
TreeNodeHierarchyChildren = new HashSet<TreeNodeHierarchy>();
TreeNodeHierarchyParents = new HashSet<TreeNodeHierarchy>();
}
public int Id { get; set; }
public string Name { get; set; }
public string Code { get; set; }
public bool IsLeaf { get; set; }
public int? OrganisationId { get; set; }
public bool IsDeleted { get; set; }
public virtual ICollection<TreeNodeHierarchy> TreeNodeHierarchyChildren { get; set; }
public virtual ICollection<TreeNodeHierarchy> TreeNodeHierarchyParents { get; set; }
}
public partial class TreeNodeHierarchy
{
public int Id { get; set; }
public int ParentId { get; set; }
public int ChildId { get; set; }
public virtual TreeNode Child { get; set; }
public virtual TreeNode Parent { get; set; }
}
并在 dbcontext 类中进行以下映射:
modelBuilder.Entity<TreeNode>(entity =>
{
entity.ToTable("TreeNode");
entity.Property(e => e.Code).HasMaxLength(100);
entity.Property(e => e.Name)
.IsRequired()
.HasMaxLength(255);
});
modelBuilder.Entity<TreeNodeHierarchy>(entity =>
{
entity.ToTable("TreeNodeHierarchy");
entity.HasOne(d => d.Child)
.WithMany(p => p.TreeNodeHierarchyChildren)
.HasForeignKey(d => d.ChildId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_TreeNodeHierarchy_TreeNode_Child");
entity.HasOne(d => d.Parent)
.WithMany(p => p.TreeNodeHierarchyParents)
.HasForeignKey(d => d.ParentId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_TreeNodeHierarchy_TreeNode_Parent");
});
这是问题,当我写以下内容时:
var nodes = _context.TreeNodes.Include(th => th.TreeNodeHierarchyChildren)
.Where(tn => tn.IsLeaf)
.....
它加载孩子而不是父母。
此关系在使用 LINQ to SQL 的当前应用程序 (.net 4.7) 中正常工作。
我错过了什么吗?
更新
正如@SpruceMoose 所建议的那样,我还在查询中包含了 TreeNodeHierarchyParents 属性,但它没有解决问题。
var nodes = _context.TreeNodes
.Include(th => th.TreeNodeHierarchyChildren)
.Include(th => th.TreeNodeHierarchyParents)
.Where(tn => tn.IsLeaf)
更新#2
我应用了@Dave 建议的映射,我认为这很有意义(最后,关系就像 Windows 文件夹/文件系统)。 无论如何,仍然有一些东西不能正常工作。当我调试以下代码时:
var nodes = _context.TreeNodes
.Include(th => th.TreeNodeHierarchyChildren)
.Include(th => th.TreeNodeHierarchyParents)
.Where(tn => tn.IsLeaf)
.ToList();
我仍然看到父级尚未加载
【问题讨论】:
标签: c# sql-server .net-core entity-framework-core ef-database-first