8

我在开发树层次结构时遇到了实体框架代码优先方法的问题。

我需要在数据库中存储一些树。我的表有三个字段 Id、Name 和 Parent_Id。我在我的解决方案中创建了以下类:

public class TreeNode
{
    public TreeNode()
    {
        Children = new List<TreeNode>();
    }

    public int Id { get; set; }

    [Required]
    public String Name { get; set; }

    public virtual IList<TreeNode> Children { get; set; }

    public virtual TreeNode Parent { get; set; }
}

我为 TreeNode 类添加了以下配置

            modelBuilder.Entity<TreeNode>().HasOptional(c => c.Parent)
                    .WithMany(c => c.Children)
                    .Map(m => m.MapKey("Parent_Id"));

问题是当 EF 返回时,Children 始终为 null。

但是,如果检索某个子节点,则通过 Parent 属性获取其父节点,然后正确填充 Children 属性。

我不确定这里有什么问题。寻求您的建议。

更新:向导航属性添加虚拟修饰符没有帮助

4

1 回答 1

11

virtual正如@Cuong 建议的那样,将属性标记为。这将启用延迟加载(每次您尝试访问 Children 时都会执行对服务器的附加查询):

public virtual IList<TreeNode> Children { get; set; }

或在加载父级时急切加载子级:

var nodes = context.TreeNodes.Include(n => n.Children);
于 2013-07-26T06:29:49.463 回答