我在开发树层次结构时遇到了Entity Framework Code First方法的问题。
我需要在数据库中存储一些树。我的表有三个字段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属性获取其Parent节点,则正确填充Children属性。
我不确定这里有什么问题。寻找你的建议。
更新:向导航属性添加虚拟修改器无效
答案 0 :(得分:8)
将属性标记为virtual
,如@Cuong所示。这将启用延迟加载(每次您尝试访问子项时,将执行对服务器的其他查询):
public virtual IList<TreeNode> Children { get; set; }
或者在加载父级时加载子项:
var nodes = context.TreeNodes.Include(n => n.Children);