如何清除分离的DevForce实体的原始值

时间:2014-09-11 22:20:54

标签: c# devforce

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

中的数据

原始值适用于我们已添加到实体的DataEntityProperties,但未标记为[DataMember],因此它们通常不会被发送到服务器。 如果我们有一个现有的(以前保存的实体),然后更改其中一个属性,属性的初始值最终会被序列化为{{{ 1}}。这导致了我们的大问题,因为事实证明原始值是一个具有巨大实体图的实体。

添加问题,我们正在处理的实体实际上是现有(先前保存的)实体的克隆(通过OriginalValuesMap),因此它们具有分离状态,我还没有找到办法清除已分离实体的((ICloneable)origEntity).Clone()。通常我会做OriginalValuesMap但是对于分离的实体没有做任何事情。我找不到任何其他简单的方法来做到这一点。

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

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

我们的应用是运行DevForce 2012 v7.2.4.0

的Silverlight客户端

1 个答案:

答案 0 :(得分:0)

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