呼び出しの一部として特定のエンティティをサーバーに送信するときに、さまざまなStackOverflowException
andが発生しています。この問題は、DevForce が予想よりも多くのデータをシリアル化しようとするために発生したようです。に保存されているデータまで追跡しました。OutOfMemoryException
InvokeServerMethod
OriginalValuesMap
元の値はDataEntityProperties
、エンティティに追加したものですが、 でマークされて[DataMember]
いないため、通常はサーバーに送信されません。 しかし、既存の (以前に保存されたエンティティ)があり、それらのプロパティの 1 つを変更すると、プロパティの初期値はOriginalValuesMap
. 元の値が巨大なエンティティ グラフを持つエンティティであることが判明するため、これは大きな問題を引き起こしています。
問題に加えて、私たちが扱っているエンティティは、実際に((ICloneable)origEntity).Clone()
は既存の (以前に保存された) エンティティの ( による) クローンであるため、切り離された状態になり、OriginalValuesMap
切り離されたエンティティの をクリアする方法が見つかりませんでした。通常はそうしますmyEntity.EntityAspect.AcceptChanges()
が、切り離されたエンティティには何もしません。これを行う簡単な方法が他に見つかりませんでした。
これまでのところ、元の値をクリアする唯一の方法は、エンティティをエンティティ マネージャーにアタッチすることです。これは元の値をクリアすることになりますが、実際には多数のエンティティを扱っているため(パフォーマンスが懸念されます)、これらのエンティティの多くは一意の主キー値を持っていないため(実際には、実際に保存する予定のない「メモリ内」オブジェクトであるため、キー値が入力されていないため、エンティティに追加するときに「重複キー例外」エラーを回避するために追加の作業を行う必要がありますマネジャー。
切り離されたエンティティの元の値をクリアできる他の方法はありますか? それとも、AcceptChanges のようなものが切り離されたエンティティに対しても機能しない場合、切り離されたエンティティは最初から元の値を追跡する必要がありますか? それとも、複製されたエンティティは、そのソースの元の値を「継承」してはならないのでしょうか? 私はこれらの可能性のどちらについても強い意見を持っていません...エンティティをシリアル化できるようにしたいだけです。
私たちのアプリは、DevForce 2012 v7.2.4.0 を実行する Silverlight クライアントです。