如何解决EF导航属性循环问题
| 我目前有一个看起来像这样的数据库Person Table
Id
Name
AddressLookupTypeId
AddressLookupType Table
Id
Description
SortOrder
当我使用实体框架4.0的设计器并添加两个表时,我在两个类上都获得了导航属性,即:
Person Class
Id
Name
AddressLookupType - Nav Property
AddressStatusLookup Class
Id
Description
SortOrder
Person - Navigation Property
现在我的人员表有大约3+百万条记录,而地址类型只有大约50条左右的记录。
当我出于任何原因更新任何人的状态并致电保存更改时,将永远需要进行更新;如果我在代码执行过程中暂停和调试,则会遇到称为FixupAddressStatusLookup的方法。
我不知道这里到底发生了什么,但在我看来,它就像遍历具有相同addressstatustype的Person记录的子集一样;那只是我最好的猜测。如果我从设计器中的AddressStatusLookup类中删除Person导航属性,则代码将立即执行。
谁能解释这可能是怎么回事?为什么在我的AddressStatusLookup上具有Person的导航属性会导致此类延迟?
谢谢
解决方法
您的fixup方法可能看起来像这样:
private void FixupAddressStatusLookup(AddressStatusLookup previousValue)
{
if (previousValue != null && previousValue.Persons.Contains(this))
{
previousValue.Persons.Remove(this);
}
// more ...
}
在Person
类的AddressStatusLookup
导航属性的设置器中调用它。
现在,假设您启用了延迟加载,并向Person
实体分配了一个新的ѭ3((调用了setter,因此调用了fixup方法):previousValue.Persons.Something...
使延迟加载对数据库运行查询,该查询将加载所有AddressStatusLookup
的人值previousValue
-这与您的数百万个人和只有50个状态有关,可能是成千上万的记录的清单,这些记录在Contains
被执行之前就已被加载。
我不知道这些自动生成的修复方法如何与延迟加载兼容而不引起此类问题。
要解决该问题,您可以尝试:
从您的AddressStatusLookup
类中删除Person
集合(因为您已经尝试过成功)。无论如何,它的有用性值得怀疑。
或:不适用于延迟加载
或者:从生成的类中删除fixup方法。 (也许可以调整T4模板并创建自定义模板,从而一开始就禁止生成这些方法,但是我不确定。)
(如果您没有启用延迟加载,则此答案可能完全没有用。)
, 听起来您正在使用T4 POCO模板?如果是这样,您将看到正在运行的FixUp代码,该代码可以修复一端到另一端的关系。我发现它对于非平凡的数据库基本上不起作用,因为它遍历关系的许多末端以确保正确设置了反向指针。最好的办法是在context.ContextOptions中关闭LazyLoading并在需要时使用Include等加载关系。
编辑:有关发生了什么的更多解释可以在这里找到http://blogs.msdn.com/b/efdesign/archive/2010/03/10/poco-template-code-generation-options.aspx
另外,ADO.NET SelfTrackingEntity Generator生成的对象没有延迟加载,因此也不要这样做。
, 为该特定操作设置Context.ContextOptions.LazyLoadingEnabled = false;保存完成后,将其重置为true。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。