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

本文关键字:DevForce 实体 原始 分离 何清除 清除 | 更新日期: 2023-09-27 18:21:44

在将某些实体作为InvokeServerMethod调用的一部分发送到服务器时,我们会遇到各种StackOverflowExceptionOutOfMemoryException。这个问题似乎是因为DevForce最终试图序列化比我们预期的多得多的数据。我追踪到了存储在OriginalValuesMap中的数据。

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

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

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

有没有其他方法可以清除分离实体的原始值?或者,如果AcceptChanges之类的东西甚至不适用于分离的实体,那么分离的实体应该首先跟踪原始值吗?或者克隆的实体不应该"继承"其源的原始值?我对这两种可能性都没有强烈的看法。。。我只想能够序列化我的实体。

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

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

在深入研究分离实体的正确行为之前,我想备份并验证是否真的是OriginalValuesMap导致了异常。OriginalValuesMap的内容应该遵循DataContractSerializer的常规规则,所以我认为非DataMember项不会被序列化。你能尝试将其中一个问题实体序列化为文本文件发送给IdeaBlade支持吗?您可以使用SerializationFns.Save(实体、文件名、null、false)快速序列化项。如果OriginalValuesMap看起来确实包含了不应该包含的内容,那么我还需要相关的类型定义。