Entity framework 4 禁用延迟加载时,导航属性返回null

Entity framework 4 禁用延迟加载时,导航属性返回null,entity-framework-4,lazy-loading,Entity Framework 4,Lazy Loading,简言之,问题是: 如果代码访问导航属性,并且请求的数据未加载到内存中,并且延迟加载被禁用,是否有方法使EF抛出异常 再长一点: 我正在使用EntityFramework4(模型优先)并禁用了延迟加载。以前,如果我运行类似于以下内容的代码,代码运行会很好,但速度会很慢,因为每次调用customer.Orders都会导致执行新的SQL查询: inttotalvalue=0; foreach(efContext.Customers中的var客户) foreach(客户订单中的var订单) totalV

简言之,问题是:

如果代码访问导航属性,并且请求的数据未加载到内存中,并且延迟加载被禁用,是否有方法使EF抛出异常

再长一点:

我正在使用EntityFramework4(模型优先)并禁用了延迟加载。以前,如果我运行类似于以下内容的代码,代码运行会很好,但速度会很慢,因为每次调用customer.Orders都会导致执行新的SQL查询:

inttotalvalue=0;
foreach(efContext.Customers中的var客户)
foreach(客户订单中的var订单)
totalValue+=订单价值;
我想完全禁用延迟加载,以防止在我正在处理的代码库中引入此类代码。我想要发生的是,当代码执行customer.Orders时,应该抛出一个异常,声明类似“实体未加载。延迟加载已关闭”这样的内容。但是,订单列表只是空的,因为订单尚未加载

我觉得这种行为也可能有问题,只是方式不同于惰性加载。负责检查每个客户是否有联系人的开发人员可以编写如下内容:

if(customer.Contact!=null)
抛出新异常(“客户缺乏联系”);
但是禁用延迟加载后,customer.Contact将始终为null,开发人员可能会认为他的代码工作正常。当然,他应该正确地完成他的工作并测试这两个场景(contact-existing,contact-not-existing),但是如果抛出异常,情况会更清楚

在我看来,如果我试图访问不可用的数据,而只是返回一个空列表,Entity Framework就不会抛出异常,这似乎很奇怪


对这种行为有什么解释吗?当调用导航属性且数据不可用时,是否有方法使EF抛出异常?

您可以测试每个条目以确保其已加载

如果它是一个集合:

model.Entry(customer).Collection(c => c.Customers).IsLoaded
model.Entry(customer).Reference(c => c.Customer).IsLoaded
如果它不是一个集合:

model.Entry(customer).Collection(c => c.Customers).IsLoaded
model.Entry(customer).Reference(c => c.Customer).IsLoaded
但是,我认为,如果您在遍历集合之前急切地加载集合,从而保证集合已加载,而不是担心集合是否已加载,这会更好:

foreach(var customer in efContext.Customers.Include(c => c.Orders))

这种方法的问题在于,对于编写代码的开发人员来说,他必须做什么并不明显。如果他不急切地加载数据,他的代码仍然会毫无例外地运行,只是行为不正确。如果在尝试访问未加载的数据时引发异常,则很明显需要加载数据