【发布时间】: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