3

s'il vous plaît aidez-moi avec le problème suivant. J'ai une classe, commeEntityFramework code premier et circulaire référence un-à-plusieurs

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; } 
} 

et fluide

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); 
} 

mais il ne fonctionne pas. J'essaie de l'utiliser comme suit:

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

mais la propriété children pour chaque entité parente est null.

est-il possible de le faire?

Répondre

2

Vous devez soit faire les deux Parent et Childrenvirtual pour soutenir le chargement paresseux (il peut déclencher vraiment beaucoup de requêtes à la base de données) ou vous devez indiquer explicitement EF pour charger les enfants en utilisant le chargement désireux. Le problème avec le chargement impatient est que cela ne fonctionne pas récursivement, il chargera seulement autant de niveaux que vous dites à EF. EF et son mécanisme de requête n'est pas très approprié pour les relations récursives (structures arborescentes)

Questions connexes