向数据库添加条目时,从控制器返回一个 PartialView,它应该简单地显示 html 列表中的所有对象。
但是,如果表中只有 0 条或 1 条记录(如果有更多,则可以正常工作),工作室会挂起并显示以下消息:
“Microsoft Visual Studio 很忙。”
而且如果是错误的话还好,你可以通过某种方式调试它,但是只花了半天时间来寻找原因......
楷模:
public class Basket
{
public int Id { get; set; }
public int? ProductId { get; set; }
public virtual Product Product { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Title { get; set; }
}
控制器:
public ActionResult AddProduct(int productId, int count)
{
if (ModelState.IsValid )
{
var basket = new Basket();
//....
db.Baskets.Add(basket);
db.SaveChanges();
return PartialView(db.Baskets);
}
}
并在写入数据库后返回此 PartialView
@model IEnumerable<ShopStore.Models.Basket>
@foreach (var item in Model)
{
<li><a href="#">@item.Product.Title</a></li>
}
错误在这里:item.Product.Title,如果你写item.Id,那么一切正常,也就是说,错误似乎是在加载产品时,但“幕后”发生的事情尚不清楚我。再一次,为什么一切都适用于两个或更多条目....
谢谢!

好吧,首先,让我重复一遍:
EF中加载相关数据的方式有以下三种:
其次,让我们尝试描述机制。当您将查询编写为 db.Baskets 时,该表单的一个 SQL 查询将发送到服务器
SELECT * FROM basket。就是这样。假设这个单一查询“仅”返回 800 行。当您开始执行视图时,您将在一个循环中创建另外 800 个查询,但已经针对产品表。类似的东西
SELECT * FROM product WHERE id = 1(然后是 2、3 等等八百次)。在较慢的笔记本电脑上,您可以看到很好的幻灯片和刹车。在我的查询中,我要求立即拉出产品表——所以我的 SQL 查询只执行了 1 次,而不是 801 次。
我的 SQL 查询看起来像这样:
没什么特别的,只有一个 JOIN。
机制清楚吗?
第三,如果你禁用延迟加载,你(除了在你的项目中看到一堆错误)将立即学会思考计算机发出的请求,它们是如何优化的。现在你可能很难评估这种制度的好处,但这是一个很好的做法。