2

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

例如:

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 属性为空。

4

2 回答 2

2

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

}
于 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 不会自动加载关系。你有两个选择:

  • 为 Parent 属性打开延迟加载,使属性变为虚拟(在这种情况下,EF 可以覆盖它来执行加载
  • 使用Include方法明确告诉 EF,当您请求 Page 时也加载关联的 Parent 对象。因此,您的 GetFirstPage() 方法应包含以下内容:

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