Код EntityFramework сначала и круговая ссылка один ко многим - PullRequest
3 голосов
/ 28 октября 2011

, пожалуйста, помогите мне решить следующую проблему.У меня есть класс, как

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 Ответ

2 голосов
/ 28 октября 2011

Вы должны либо сделать Parent, либо Children virtual для поддержки отложенной загрузки (это может инициировать очень много запросов к базе данных), либо вы должны явно указать EF загружать дочерние объекты с помощью активной загрузки.Проблема с энергичной загрузкой в ​​том, что она не работает рекурсивно, она загружает столько уровней, сколько вы скажете EF.

EF и его механизм запросов не очень подходят для рекурсивных отношений (древовидных структур).

...