2013-07-26 11 views
6

Ich habe ein Problem mit Entity Framework Code Erste Annäherung bei der Entwicklung von Baumhierarchien.EF-Code zuerst. Kindersammlung ist Null für Eltern

Ich muss einige Baum in einer Datenbank speichern. Meine Tabelle hat drei Felder ID, Name und Parent_Id. Ich habe die folgende Klasse in meiner Lösung:

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

ich die folgende Konfiguration für TreeNode Klasse

  modelBuilder.Entity<TreeNode>().HasOptional(c => c.Parent) 
        .WithMany(c => c.Children) 
        .Map(m => m.MapKey("Parent_Id")); 

Die Frage hinzugefügt haben, ist, dass Kinder immer null ist, wenn sie von EF zurückgegeben.

Wenn Sie jedoch einen untergeordneten Knoten abrufen, erhalten Sie den Parent-Knoten über die Parent-Eigenschaft und die Children-Eigenschaft wird korrekt ausgefüllt.

Ich bin mir nicht sicher, was hier falsch ist. Auf der Suche nach Ihrem Rat.

Update: Zugabe von virtuellen Modifikator Navigationseigenschaften nicht helfen

Antwort

7

Entweder Marke Eigenschaften wie virtual, wie @Cuong vorgeschlagen. Dies wird faul-Laden ermöglichen (jedes Mal, wenn Sie versuchen, Kinder zusätzliche Abfrage an den Server zugreifen wird ausgeführt):

public virtual IList<TreeNode> Children { get; set; } 

ODER eifrig Last Kinder beim Laden parent:

var nodes = context.TreeNodes.Include(n => n.Children); 
+0

Dank. Auch mit virtuellen Eigenschaften Kinder werden nicht zurückgegeben. – lostaman

+0

@lostaman stellen Sie sicher, dass Lazy-Loading für den Kontext aktiviert ist context.Configuration.LazyLoadingEnabled = true; ' –

+0

Danke @lazyberezovsky. Ich habe diese Option auf false gesetzt. Ich habe es in "true" geändert und erhalte jetzt einen Fehler "Es ist bereits ein offener DataReader mit diesem Befehl verbunden, der zuerst geschlossen werden muss", wenn er versucht, auf die Children-Sammlung zuzugreifen. – lostaman

Verwandte Themen