gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:54:10 26 4
gpt4 key购买 nike

问题简而言之:

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

有点长:

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

int totalValue = 0;
foreach(var customer in efContext.Customers)
foreach (var order in customer.Orders)
totalValue += order.Value;

我想完全禁用延迟加载,以防止在我正在处理的代码库中引入此类代码。我想要发生的是,当代码执行 customer.Orders 时,应该抛出一个异常,说明“实体未加载。延迟加载关闭。”。但相反,订单列表只是空的,因为订单尚未加载。

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

if (customer.Contact != null) 
throw new BlablablaException("Customer lacks contact");

但是禁用延迟加载后,customer.Contact 将始终为 null,开发人员可能会认为他的代码工作正常。当然,他应该正确地完成他的工作并测试两种场景(联系人存在,联系人不存在),但是如果抛出异常会更清楚。

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

这种行为有解释吗?当导航属性被调用并且数据不可用时,有没有办法让 EF 抛出异常?

最佳答案

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

如果是一个集合:

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))

关于entity-framework-4 - 禁用延迟加载时,导航属性返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12534605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com