ASP.NET MVC "strong" relationships

本文关键字:quot relationships strong NET MVC ASP | 更新日期: 2023-09-27 18:10:42

目前我有一个模型是递归的(它的属性之一是相同的类型)。

例如:

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

现在,当我想访问某人的父母时,我必须获得ParentID,查询数据库并找到Page。我想要做的是:

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。

ASP.NET MVC "strong" relationships

您需要使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; }
}

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不自动加载关系,如果你不使用延迟加载。您有两个选项:

  • 打开父属性的延迟加载,使该属性为虚拟(在这种情况下EF可以覆盖它来做加载
  • 用Include方法显式地告诉EF,当你请求一个页面时,也要加载相关的父对象。所以你的GetFirstPage()方法应该包含如下内容:

    efContext.Pages.Include(p => p.Parent).First();