EntityFramework代码首先是循环的一对多引用

时间:2011-10-28 19:03:35

标签: entity-framework entity-framework-4.1 ef-code-first entity-framework-ctp5

请帮我解决以下问题。我有一个班级,比如

public class TopicItem
{
    public TopicItem()
    {
        _children = new List<TopicItem>();
    }
    public int Id { get; set; }
    public string Title { get; set; }
    public int? ParentId { get; set; }
    public TopicItem Parent { get; set; }
    public List<TopicItem> Children { get; set; }
}

和流利

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<TopicItem>().HasKey(t => t.Id);
    modelBuilder.Entity<TopicItem>().Property(t => t.Title).IsRequired();
    modelBuilder.Entity<TopicItem>().Property(t => t.Alias);
    modelBuilder.Entity<TopicItem>().HasOptional(t => t.Parent).WithMany(t => t.Children).HasForeignKey(t => t.ParentId);
    //modelBuilder.Entity<TopicItem>().HasMany(t => t.Children).WithOptional(t => t.Parent).HasForeignKey(t => t.ParentId);
    base.OnModelCreating(modelBuilder);
}

但它不起作用。我试着按如下方式使用它:

public void Recursion(List<TopicItem> items)
{
    if (items != null)
    {
        foreach (var item in items)
        {
            Process(item);
        }
        Recursion(item.Children);
    }
}

Recursion(MyContext.TopicItems.Where(t => t.Parent == null).ToList())

但每个父实体的children属性为null。

是否可以这样做?

1 个答案:

答案 0 :(得分:2)

您必须同时使ParentChildren virtual支持延迟加载(它可以触发对数据库的大量查询),或者您必须明确告诉EF加载子项急切的装载。急切加载的问题在于它不能递归地工作,它只会加载与告诉EF一样多的级别。

EF及其查询机制不太适合递归关系(树结构)。