实体框架中的多对多关系导致无限循环
Posted
技术标签:
【中文标题】实体框架中的多对多关系导致无限循环【英文标题】:Many-to-many relations in entity framework causes infinite loop 【发布时间】:2012-02-28 14:01:26 【问题描述】:我在 SQL Server 中有一个具有多对多关系的数据模型。当 Entity Framework 对这种关系进行建模时,它通过创建一个双向列表引用来实现,如下所示:
public class Class1
public ICollection<Class2> Class2s get;set;
public class Class2
public ICollection<Class1> Class1s get;set;
现在的问题是,在某些情况下(但不是全部)这似乎会导致无限循环。我有一个案例,当我在其中一个集合上调用 Add()
时,它会导致框架在两个类的属性的 get 方法之间来回循环,从而有效地占用所有 CPU 并冻结应用程序。
有没有人经历过这样的事情?我能做些什么来防止它发生?
PS:我使用Rab Hallett's Mocking Framework generator 来生成代码。不知道这是否相关。
更新 1:肯定和 mocking 框架有关
更新 2:这不是一个无限循环,但它会访问两个表中的所有元素 - 可能会导致 n*m 访问。我会更深入地研究它并回来
【问题讨论】:
肯定和 Hallet 的 Mocking Framework 有关。该行为无法通过标准 .NET Entity Framework 代码生成重现 Nilzor,你能确认一下吗?是否可以在没有模拟框架的情况下在上下文中运行相同的案例? 以上评论为确认。我确实在没有模拟框架的情况下运行了相同的案例。编辑:所以为了解决我的问题,我必须 a) 修复或解决这个错误,或者 b) 为 EF 找到一个不同的可模拟对象生成器 当然! (脸红)完全忽略了名字......我在框架的博客上发表了评论。 【参考方案1】:正如您所说,无限循环仅在某些情况下。这可能是数据问题。
如果您以 class1 X 有 3 个 class2 的 A、B 和 C 为例。如果 class2 A 又具有 X 的 class1,那么您有一个无限循环。
我在使用 Automapper 时也遇到过这个问题。
要修复它,您可以:
清理数据,避免无限循环 添加一个计数器,在 x 次迭代后停止循环【讨论】:
不幸的是,触发 Get 调用的代码位于实体框架中,因此我无法更改它。我也无法更改数据结构,因为它们是代码生成工具的产物。不过,我可以更改代码生成工具,这就是我现在所做的。 (见更新1)以上是关于实体框架中的多对多关系导致无限循环的主要内容,如果未能解决你的问题,请参考以下文章