该属性定义为virtual
。但是在我访问订单属性之前,订单实体的数据已加载,为什么?
完整源代码:
答案 0 :(得分:0)
几件事:
当您声明:不起作用时,您将获得订单,但是当您期望其他值时,$数字为0.0?您似乎有2笔订单记录,但是基于返回的结果,您期望的数字不是零,这两个记录都是非零的吗?在调试视图中,展开弹出菜单中的“订单”,这将显示EF已加载的订单详细信息。
首先,您应该注意使用方法的“ OrDefault”形式。您的代码假定返回值。在这些情况下,最好使用Single()
或First()
(如果适用)。
此外,在使用First
时,应指定一个OrderBy
子句以确保顺序可靠。
SaveChanges
仅在修改数据时调用。
最后,延迟加载是用于按需加载不常用数据的启动器。您应该在很大程度上避免依赖延迟加载调用。如果您需要整个实体,并且知道要使用订单,请急于加载它们。
即
using (var context = new EfContext())
{
var customer = context.Customers
.Include(c => c.Orders)
.Single(c => c.CustomerId = customerId);
// Do stuff...
}
如果您只需要给定员工1个适用的订单,则可以考虑使用Select
进行检索:
即
using (var context = new EfContext())
{
var data = context.Customers.Where(c => c.CustomerId = customerId)
.Select(c => new { Customer = c, FirstOrder = c.Orders.OrderBy(o => o.OrderDate).FirstOrDefault()})
.Single();
// Do Stuff...
}
这将为您提供一个匿名类型,其中包含客户(不急于加载订单)和匹配的第一笔订单。
更好的方法是使用Select
从客户和订单中检索您需要的特定字段。这样可以减少从数据库中拉回的数据量(行和列)。
答案 1 :(得分:0)
对不起,好像是Visual Studio的问题,当注释调用语句时,不再执行订单表的sql查询,但是当包含调用语句时,尽管设置了断点,订单表的sql查询仍然被执行。
Visual Studio调试自动执行表达式