2

現在、再帰的なモデ​​ルがあります(そのプロパティの1つは同じタイプです)。

例えば:

public class Page
{
  public int ID { get; set; }
  public string Description{ get; set; }
  public int ParentID  {get; set; }

}

ここで、誰かの親にアクセスしたい場合は、ParentIDを取得し、データベースにクエリを実行して、ページを見つける必要があります。私が欲しいのは、次のことができることです。

Page page = _db.GetFirstPage();
Page pagesParent = page.Parent;

どうすればそれを達成できますか?私は次のことを試しました:

public class Page
{
  public int ID { get; set; }
  public string Description{ get; set; }
  public int ParentID  {get; set; }
  public Page Parent { get; set; }

}

エンティティフレームワークは自動的にParentがparentIDにリンクされていると想定するので、それは機能しません。


これが私のコードです。コントローラーのメソッドは次のとおりです。

public ActionResult Create()
    {
        var pages = _db.Pages;
        ViewBag.Pages = new SelectList(pages,"ID","Description");
        return View();
    }

ビューで:

    <div class="editor-label">
        @Html.LabelFor(model => model.ParentID)
    </div>
    <div class="editor-field">
        @Html.DropDownList("Pages", String.Empty)
        @Html.ValidationMessageFor(model => model.ParentID)
    </div>

モデル:

    public int ID { get; set; }
    public string Description { get; set; }
    public string Body { get; set; }

    public int? ParentID { get; set; }
    public virtual Page Parent { get; set; }

ビューの作成に移動したとき。すべてのページのリストを取得しましたが、それらを作成すると、新しいページのParentプロパティがnullになります。

4

2 に答える 2

2

すべてのページに親があるわけParentIDではないため、プロパティをnull許容にする必要があります。また、プロパティを仮想化して、遅延読み込みを可能にします。Parent

public class Page
{
  public int ID { get; set; }
  public string Description{ get; set; }

  public int? ParentID  {get; set; }
  public virtual Page Parent { get; set; }

}
于 2011-10-09T11:53:48.173 に答える
1

もちろん、EFは再帰的な関連付けを処理でき、自動的に関連付けを検索することもできます。したがって、このコードは問題ありません。

public class Page
{
  public int ID { get; set; }
  public string Description{ get; set; }
  public int ParentID  {get; set; }
  public Page Parent { get; set; }

}

問題は、遅延読み込みを使用していない場合、EFがリレーションを自動的に読み込まないことです。2つのオプションがあります。

  • プロパティを仮想化するときに、Parentプロパティの遅延読み込みをオンにします(この場合、EFはそれをオーバーライドして、ロードを実行できます
  • Includeメソッドを使用してEFに、ページを要求したときに関連する親オブジェクトもロードするように明示的に指示します。したがって、GetFirstPage()メソッドには次のようなものが含まれている必要があります。

    efContext.Pages.Include(p => p.Parent).First();
    
于 2011-10-09T10:57:52.667 に答える