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