2013-07-26 41 views
6

我在开发树层次结构时遇到实体框架代码优先的问题。EF代码优先。子集合对于父项为空

我需要在数据库中存储一些树。我的表有三个字段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; } 
} 

我已经添加了以下配置树节点类

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

的问题是,当通过EF返回儿童总是空。

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

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

更新:除了虚拟修饰符的导航性能没有帮助

回答

7

无论是标志性的virtual,作为@Cuong建议。加载父当

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

或急于负载孩子:

var nodes = context.TreeNodes.Include(n => n.Children); 
+0

感谢这将使延迟加载(每次当你将尝试访问儿童更多的查询服务器将执行)。即使使用虚拟属性儿童也不会被退回。 – lostaman

+0

@lostaman确保上下文启用延迟加载'context.Configuration.LazyLoadingEnabled = true;' –

+0

Thanks @lazyberezovsky。我有这个选项设置为false。我将它更改为true,现在我收到一条错误消息:“尝试访问Children集合时,已经有一个与此命令关联的打开的DataReader,它必须先关闭”。 – lostaman