如何清除分离的DevForce实体的原始值
本文关键字:DevForce 实体 原始 分离 何清除 清除 | 更新日期: 2023-09-27 18:21:44
在将某些实体作为InvokeServerMethod
调用的一部分发送到服务器时,我们会遇到各种StackOverflowException
和OutOfMemoryException
。这个问题似乎是因为DevForce最终试图序列化比我们预期的多得多的数据。我追踪到了存储在OriginalValuesMap
中的数据。
原始值是我们添加到实体中的DataEntityProperties
,但没有用[DataMember]
标记,因此它们通常不会发送到服务器但是如果我们有一个现有的(以前保存的实体),然后更改其中一个属性,则属性的初始值最终会被序列化为OriginalValuesMap
的一部分。这给我们带来了很大的问题,因为原来的值是一个有巨大实体图的实体。
更糟糕的是,我们正在处理的实体实际上是现有(以前保存的)实体的克隆(通过((ICloneable)origEntity).Clone()
),因此它们处于分离状态,我还没有找到清除分离实体的OriginalValuesMap
的方法。通常我会做myEntity.EntityAspect.AcceptChanges()
,但这对分离的实体没有任何作用。我找不到其他简单的方法来做这件事。
到目前为止,我发现清除原始值的唯一方法是将实体附加到实体管理器。这最终会清除原始值,但这是一个很大的痛苦,因为我实际上要处理大量的实体(因此性能是一个问题),而这些实体中的许多没有唯一的主键值(事实上,它们没有填充任何键值,因为它们只是"内存中"的对象,我不打算实际保存),所以我需要做额外的工作来避免将它们添加到实体管理器时出现"重复键异常"错误。
有没有其他方法可以清除分离实体的原始值?或者,如果AcceptChanges之类的东西甚至不适用于分离的实体,那么分离的实体应该首先跟踪原始值吗?或者克隆的实体不应该"继承"其源的原始值?我对这两种可能性都没有强烈的看法。。。我只想能够序列化我的实体。
我们的应用程序是运行DevForce 2012 v7.2.4.0 的Silverlight客户端
在深入研究分离实体的正确行为之前,我想备份并验证是否真的是OriginalValuesMap导致了异常。OriginalValuesMap的内容应该遵循DataContractSerializer的常规规则,所以我认为非DataMember项不会被序列化。你能尝试将其中一个问题实体序列化为文本文件发送给IdeaBlade支持吗?您可以使用SerializationFns.Save(实体、文件名、null、false)快速序列化项。如果OriginalValuesMap看起来确实包含了不应该包含的内容,那么我还需要相关的类型定义。