【问题标题】:Eliminating cycles in EF 4 STE object graph消除 EF 4 STE 对象图中的循环
【发布时间】:2012-06-18 21:48:53
【问题描述】:

我回到post 上的“绘图板”上,我之前写过关于 StackOverflowException 的尝试序列化 EF STE 对象图...在未能成功调整 IIS7 中的堆栈大小后,如所述@ 987654322@,我决定走上追根溯源的道路……

我认为这与 EF 模型的设计方式有关。

简单来说,我有一个父实体和一个子实体。 Child 实体有两个导航属性返回到 Parent,例如Child.Parent 和 Child.ParentUsed。当然,父级有两个子级集合。

仔细查看导致 StackOverflow 异常的数据后,我注意到这个对象图中有几个循环。我无法证明这一点,但我相当肯定循环导致了这个 StackOverflow 异常。

如果我在数据库中删除该表的数据,问题就会消失,但我将无法删除客户机器上的记录。不管设计是否糟糕,我必须以某种方式在 EF 级别解决这个问题。

我有什么选择来重做这个?如果我的 Child 对象没有返回父对象的导航属性,而是有两个 int Fks,我想知道是否会有导致序列化阻塞的循环?有没有办法在一个实体上将导航属性更改为 Fks?

谢谢!

更新:

将子项的两个导航属性移回父项可解决此问题。我认为这不一定是循环问题,但可能堆栈已用尽尝试检查引用并确定循环。

我不一定要删除导航属性。它们对客户端很有用。有没有更好的方法来解决这个问题?自定义序列化?

【问题讨论】:

  • 周期是什么意思? STE 标有DataContract(IsReference=true) 以检测循环,因此它们仅将对象图中的每个实体序列化一次(使用DataContractSerializer 时)。
  • 是的,我也是这么想的。我所有的实体类都标有 DataContract(IsReference=true)。
  • 您是如何发现这个问题是由周期引起的?您确定您的 STE 没有引用任何未标记属性的自定义类吗?
  • 好电话。我认为这根本不是周期问题。我能够通过从相关数据库中检索 EF 对象图并使用 DataContractSerializer 序列化该图来证明这一点。我为序列化程序的构造函数指定了一个代理,并跟踪每个序列化对象的 Id。 No Id 执行了两次。也许是对象图太深,序列化程序无法在 IIS 强加的 256kb 堆栈限制内处理它。关于如何克服这个问题的任何想法?我可以将实体序列化拆分出来,但是我必须在客户端上重新组装。
  • 我从来没有遇到过这个问题,所以我无能为力。我只是好奇 STE 如何产生周期。序列化图中有多少个对象?

标签: c# wcf entity-framework entity-framework-4 self-tracking-entities


【解决方案1】:

我在使用 WCF 测试 EF 的性能时遇到了类似的问题。当查询的结果集超过 3000 个结果时,我得到了 StackOverflow。

如果您只删除一个导航属性,StackOverflow 将会消失。我将尝试解释循环发生的位置,但你们也可以尝试使用 DataContractSeriazer 将图形序列化到文件中,当您看到生成的 XML 时,您就会意识到出了什么问题。

每个对象只被序列化一次,但是序列化是深度优先的。以您的场景为例:

1 - 序列化 parent1

2 - 序列化 ChildList1 的第一个元素

3 - 现在我们正在序列化与 parent1 相关的对象 Child1(已经序列化,因此使用了 Ref)。所以序列化 ParentUsed(一个不同的对象,parent2,与其他孩子有更多的关系) - 为 parent2 执行第 1 步

如果加载的父级列表和关系(记录之间)的复杂性足够大,序列化程序将尝试将所有图形序列化为第一个元素的“子级”(递归)。将一个导航属性移回父级将消除循环,剩余的导航属性将始终引用已序列化的父级。

如果您只使用导航属性绑定到 UI,您可以使用多个 BindingSource(我习惯于 WinForms)和 FK 来建立关系并获得与导航属性相同的结果(尽管涉及更多工作)。

希望对你有帮助,

努诺佩雷拉

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2018-03-28
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多