0

作为调用的一部分,我们在将某些实体发送到服务器StackOverflowException时遇到了各种情况。问题似乎出现了,因为 DevForce 最终试图序列化比我们预期更多的数据。我将其追踪到存储在.OutOfMemoryExceptionInvokeServerMethodOriginalValuesMap

原始值用于DataEntityProperties我们已添加到实体但未标记的值,[DataMember]因此它们通常不会发送到服务器。 但是,如果我们有一个现有的(以前保存的实体)然后更改其中一个属性,则该属性的初始值最终会被序列化为OriginalValuesMap. 这给我们带来了很大的问题,因为原来的值是一个拥有巨大实体图的实体。

更糟糕的是,我们正在处理的实体实际上((ICloneable)origEntity).Clone()是现有(以前保存的)实体的克隆(通过),因此它们具有分离状态,我还没有找到清除OriginalValuesMap分离实体的方法。通常我会这样做myEntity.EntityAspect.AcceptChanges(),但这对分离的实体没有任何作用。我找不到任何其他简单的方法来做到这一点。

到目前为止,我发现清除原始值的唯一方法是将实体附加到实体管理器。这最终会清除原始值,但这是一个很大的痛苦,因为我实际上正在处理大量实体(因此性能是一个问题)并且其中许多实体没有唯一的主键值(事实上,它们没有填写任何键值,因为它们只是我不打算实际保存的“内存中”对象)所以我需要做额外的工作以避免在将它们添加到实体时出现“重复键异常”错误经理。

有没有其他方法可以清除分离实体的原始值?或者,如果像 AcceptChanges 这样的东西甚至不适用于分离实体,分离实体是否应该首先跟踪原始值?或者,克隆实体不应该“继承”其来源的原始值?我对这些可能性中的任何一种都没有强烈的看法......我只是希望能够序列化我的实体。

我们的应用是运行 DevForce 2012 v7.2.4.0 的 Silverlight 客户端

4

1 回答 1

0

在深入探讨分离实体的正确行为之前,我想备份并验证它确实是导致异常的 OriginalValuesMap。OriginalValuesMap 的内容应该遵循 DataContractSerializer 的常规规则,所以我认为非 DataMember 项不会被序列化。您可以尝试将这些问题实体之一序列化为文本文件以发送给 IdeaBlade 支持人员吗?您可以使用 SerializationFns.Save(entity, filename, null, false) 快速序列化项目。如果 OriginalValuesMap 确实包含不应该包含的内容,我还需要涉及的类型定义。

于 2014-09-12T23:32:42.303 回答