2013-07-26 9 views
6

ツリー構造を開発する際に、Entity Frameworkのコード・ファースト・アプローチに問題があります。EFコードファースト。親の子コレクションがnullです

私はデータベースにいくつかのツリーを格納する必要があります。私のテーブルにはId、Name、Parent_Idという3つのフィールドがあります。私はツリーノードクラス

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

問題は、EFによって返されたときに子供たちは常にnullであるということであるため、以下の設定を追加しました

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

: は、私は私の溶液中で、次のクラスを作成しました。

しかし、いくつかの子ノードを取得する場合は、Parentプロパティを使用してParentノードを取得し、次にChildrenプロパティを正しく入力します。

ここで何が間違っているのか分かりません。あなたのアドバイスを探しています。

更新:@Cuongが示唆したように、ナビゲーションプロパティにvirtual修飾子のさらには、virtualとして

答えて

7

どちらのマークのプロパティを助けていません。

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

ありがとう:親をロードする際

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

OR熱心な負荷子供:これは、遅延ロード(あなたが実行されるサーバーに、子どもたちに追加のクエリにアクセスしようとするたびに)できるようになります。仮想プロパティの場合でも子は返されません。 – lostaman

+0

@ lostamanコンテキスト 'context.Configuration.LazyLoadingEnabled = true;' lazy-loadingが有効になっていることを確認してください。 –

+0

ありがとう@lazyberezovsky。このオプションはfalseに設定されています。これをtrueに変更しましたが、子コレクションにアクセスしようとすると「このコマンドに関連付けられている開いているDataReaderが最初に閉じる」というエラーが表示されます。 – lostaman

関連する問題