C# 实体框架:加载链接对象

C# 实体框架:加载链接对象,c#,asp.net-mvc,entity-framework,visual-studio-2015,C#,Asp.net Mvc,Entity Framework,Visual Studio 2015,我不知道这个问题的标题该怎么说。我正在学习MVC环境中的实体框架,我正在学习Pluralsight课程“ASP.NET MVC 3简介”。我一直在和导师一起制定解决方案,到目前为止,一切都进展顺利。但现在我遇到了一个障碍,我无法得到他正在工作的东西。我将试着描述一下障碍: 首先使用代码,我们正在构建一个简单的餐厅/评论系统。以下是我们使用的仅有的两种型号: public class Restaurant { public virtual int ID { get; set; }

我不知道这个问题的标题该怎么说。我正在学习MVC环境中的实体框架,我正在学习Pluralsight课程“ASP.NET MVC 3简介”。我一直在和导师一起制定解决方案,到目前为止,一切都进展顺利。但现在我遇到了一个障碍,我无法得到他正在工作的东西。我将试着描述一下障碍:

首先使用代码,我们正在构建一个简单的餐厅/评论系统。以下是我们使用的仅有的两种型号:

public class Restaurant
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }
    public virtual string ChefsName { get; set; }
    public virtual Address Address { get; set; }
    public virtual ICollection<Review> Reviews { get; set; }

}
你会注意到“Review”有一个指向餐馆的引用。根据这些模型创建的数据库如下所示:

以下是查看的视图:

<div class="review">
<h4>@Model.Restaurant.Name</h4>
<span>Rating: @Model.Rating</span>
<p>
    @Model.Body
    <span class="right">
        @Html.ActionLink("Edit", "Edit", new { id = Model.ID })
    </span>
</p>
“Restaurant”返回空值,因此当然会抛出空引用。以下是控制器的索引部分:

    public ActionResult Index()
    {
        var model = _db.Reviews.FindTheLatest(3);
        return View(model);
    }
下面是FindTheLatest()

在老师的在线示例中,model.Restaurant似乎又回来了,因为他没有得到任何错误。对我来说不是这样

我似乎有餐厅ID,但我不确定实体框架将如何/何时/何地基于该ID加载餐厅模型。在构建解决方案时,我似乎遗漏了一些东西,但我不知道它是什么

我已经下载了他的解决方案,但是我很难把它编译出来。(见附件)。然而,我比较了他的代码和我的代码,我不明白为什么他的代码有效而我的代码无效。我希望这里有人能帮我


谢谢

您需要包括您想要的任何相关实体。更改此项:

return reviews.OrderByDescending(r => r.Created).Take(numberOfReviews);
为此:

return reviews.Include(r => r.Restaurant).OrderByDescending(r => r.Created).Take(numberOfReviews);

您需要包括您想要的任何相关实体。更改此项:

return reviews.OrderByDescending(r => r.Created).Take(numberOfReviews);
为此:

return reviews.Include(r => r.Restaurant).OrderByDescending(r => r.Created).Take(numberOfReviews);

您应该使用方法
包括

public ActionResult Index()
{
    var model = _db.Reviews.Include(c=>c.Restaurant).FindTheLatest(3);
    return View(model);
}

此方法向EntityFramework发出信号,表示它应使用
查看
加载餐厅导航属性您应使用方法
包含

public ActionResult Index()
{
    var model = _db.Reviews.Include(c=>c.Restaurant).FindTheLatest(3);
    return View(model);
}


此方法向EntityFramework发出信号,它应该使用
Review

加载餐厅导航属性,尝试在Review构造函数中更新导航属性。我必须承认:我不知道这意味着什么。你能告诉我怎么做吗?是的,在餐馆里创建一个构造器。谷歌这是非常简单的。然后在正文中添加此代码。构造函数代码:public Review{this.restarun=new restarun();}在Review中添加上述ID。在这种情况下,餐厅名称将不会显示在视图中。首先通过在编辑器中查看表来确保数据存在。第二,尝试使用从底部包含的答案。第三,清理您的解决方案并重建所有内容,然后运行它,看看它是否已修复。尝试在Review构造函数中更新导航属性。我必须承认:我不知道这意味着什么。你能告诉我怎么做吗?是的,在餐馆里创建一个构造器。谷歌这是非常简单的。然后在正文中添加此代码。构造函数代码:public Review{this.restarun=new restarun();}在Review中添加上述ID。在这种情况下,餐厅名称将不会显示在视图中。首先通过在编辑器中查看表来确保数据存在。第二,尝试使用从底部包含的答案。第三,清理您的解决方案并重建所有,然后运行它并查看它是否已修复。这将起作用,但每次执行此操作时都需要包含。添加这个构造要简单得多,它会屏蔽所有调用,而且它不会从数据库加载数据。但提问者希望在ViewKirill上显示db数据(餐厅名称)是正确的。这是获取相关实体的标准方法。避免它的唯一方法是滚动您自己的存储库。这将起作用,但每次这样做时都需要包含。添加这个构造要简单得多,它会屏蔽所有调用,而且它不会从数据库加载数据。但提问者希望在ViewKirill上显示db数据(餐厅名称)是正确的。这是获取相关实体的标准方法。避免它的唯一方法是滚动您自己的存储库。从语义上讲,这是不正确的。方法FindTheLatest()不应添加导航属性。它应该只过滤最后3条记录。应该在之前添加Include。两者都将产生相同的结果和sql。我想这是一个问题,如果没有餐厅,你是否会想要评论。我不会。从语义上讲,这是不正确的。方法FindTheLatest()不应添加导航属性。它应该只过滤最后3条记录。应该在之前添加Include。两者都将产生相同的结果和sql。我想这是一个问题,如果没有餐厅,你是否会想要评论。我不会的。
public ActionResult Index()
{
    var model = _db.Reviews.Include(c=>c.Restaurant).FindTheLatest(3);
    return View(model);
}