ASP.NET MVC "крепкие" отношения - PullRequest
2 голосов
/ 09 октября 2011

В настоящее время у меня есть рекурсивная модель (одно из ее свойств того же типа).

Например:

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

Когда я иду в Create View. Я получаю список всех страниц, но при их создании свойство Parent новой страницы имеет значение null.

Ответы [ 2 ]

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

Вам нужно сделать свойство ParentID обнуляемым, потому что у каждой страницы не будет родитель. Также сделайте свойство 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; }

}
1 голос
/ 09 октября 2011

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 не загружает отношения автоматически, если вы не используете отложенную загрузку.У вас есть два варианта:

  • Включить отложенную загрузку для свойства Parent, сделав его виртуальным (в этом случае EF может переопределить его для выполнения кодирования
  • явнымскажите EF с помощью метода Include , чтобы при запросе страницы также загружались связанные родительские объекты, поэтому ваш метод GetFirstPage () должен содержать что-то вроде этого:

...