3

请帮我解决以下问题。我有一个类,像EntityFramework代码优先和循环一对多参考

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()) 

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

是否可以做到这一点?

回答

2

必须要么使双方ParentChildrenvirtual支持懒加载(它可以触发确实很多查询的数据库),或者你必须明确地告诉EF通过使用预先加载来加载儿童。急切加载的问题是它不能递归地工作,它只会像你告诉EF一样加载多个级别。

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