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。
您需要使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();