【发布时间】:2014-09-11 22:20:53
【问题描述】:
当作为InvokeServerMethod 调用的一部分将某些实体发送到服务器时,我们遇到了各种StackOverflowException 和OutOfMemoryExceptions。问题似乎出现了,因为 DevForce 最终试图序列化比我们预期更多的数据。我追踪到存储在OriginalValuesMap 中的数据。
原始值为DataEntityProperties,我们已添加到实体中,但未标记[DataMember],因此它们通常不会发送到服务器。 但是如果我们有一个现有的(以前保存的实体)然后更改其中一个属性,则属性的初始值确实最终会被序列化为@987654327 的一部分@。这给我们带来了很大的问题,因为原来的值是一个拥有巨大实体图的实体。
除了问题之外,我们正在处理的实体实际上是现有(以前保存的)实体的克隆(通过((ICloneable)origEntity).Clone()),因此它们处于分离状态,我还没有找到清除@987654329 的方法@ 用于分离的实体。通常我会做myEntity.EntityAspect.AcceptChanges(),但这对分离的实体没有任何作用。我找不到任何其他简单的方法来做到这一点。
到目前为止,我发现清除原始值的唯一方法是将实体附加到实体管理器。这最终会清除原始值,但这是一个很大的痛苦,因为我实际上正在处理大量实体(因此性能是一个问题)并且其中许多实体没有唯一的主键值(事实上,它们没有填写任何键值,因为它们只是我不打算实际保存的“内存中”对象)所以我需要做额外的工作以避免在将它们添加到实体时出现“重复键异常”错误经理。
还有其他方法可以清除分离实体的原始值吗?或者,如果像 AcceptChanges 这样的东西甚至不适用于分离实体,那么分离实体是否应该首先跟踪原始值?或者,克隆实体不应该“继承”其来源的原始值?我对这些可能性中的任何一种都没有强烈的看法......我只是希望能够序列化我的实体。
我们的应用是运行 DevForce 2012 v7.2.4.0 的 Silverlight 客户端
【问题讨论】: