我正在使用ASP.NET MVC5开发一个项目,并使用EF6。 我有以下课程,在作者和图书之间具有一对多关系,其中作者可以拥有多本书,而一本书只能属于一个作者:
型号:
public class Author
{
public int AuthorId { get; set; }
public string Name { get; set; }
public ICollection<Book> Books { get; set; }
}
public class Book
{
public int BookId { get; set; }
public string Name { get; set; }
public int? AuthorId { get; set; }
public Author Author { get; set; }
}
我已经使用EF使用视图生成了合适的控制器,现在,我想在Details.cshtml视图中为每个作者显示相应的关联书名。
控制器:
// GET: Authors/Details/5
public async Task<ActionResult> Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Author author = await db.Authors.FindAsync(id);
if (author == null)
{
return HttpNotFound();
}
return View(author);
}
我的 Details.cshtml 如下:
@model MyApp.Models.Author
<div>
<h4>Author Info</h4>
<hr />
<dl class="dl-horizontal">
<dt style="font-size:20px">
@Html.DisplayNameFor(model => model.Name)
</dt>
<dd style="font-size:20px">
@Html.DisplayFor(model => model.Name)
</dd>
<dt style="font-size:20px">
Associated Books
</dt>
@foreach (var item in Model.Books)
{
<dd>
@item.Name
</dd>
}
</dl>
</div>
但这会产生以下错误:
对象引用未设置为对象的实例。例外 详细信息:System.NullReferenceException:对象引用未设置为 对象的实例。
我已经遵循了类似问题(How to display a collection in View of ASP.NET MVC Razor project?)的答案,但是显然没有成功。谁能告诉我我在做什么错?
答案 0 :(得分:2)
您的视图非常好。
问题是 EF默认不会加载相关实体(出于性能原因),因此NSLayoutConstraint.activate
上的Books
属性将保持为空。
您还必须使用Author
手动告诉上下文加载书籍。例如:
.Include