0

呼び出しの一部として特定のエンティティをサーバーに送信するときに、さまざまなStackOverflowExceptionandが発生しています。この問題は、DevForce が予想よりも多くのデータをシリアル化しようとするために発生したようです。に保存されているデータまで追跡しました。OutOfMemoryExceptionInvokeServerMethodOriginalValuesMap

元の値はDataEntityProperties、エンティティに追加したものですが、 でマークされて[DataMember]いないため、通常はサーバーに送信されません。 しかし、既存の (以前に保存されたエンティティ)あり、それらのプロパティの 1 つを変更すると、プロパティの初期値はOriginalValuesMap. 元の値が巨大なエンティティ グラフを持つエンティティであることが判明するため、これは大きな問題を引き起こしています。

問題に加えて、私たちが扱っているエンティティは、実際に((ICloneable)origEntity).Clone()は既存の (以前に保存された) エンティティの ( による) クローンであるため、切り離された状態になり、OriginalValuesMap切り離されたエンティティの をクリアする方法が見つかりませんでした。通常はそうしますmyEntity.EntityAspect.AcceptChanges()が、切り離されたエンティティには何もしません。これを行う簡単な方法が他に見つかりませんでした。

これまでのところ、元の値をクリアする唯一の方法は、エンティティをエンティティ マネージャーにアタッチすることです。これは元の値をクリアすることになりますが、実際には多数のエンティティを扱っているため(パフォーマンスが懸念されます)、これらのエンティティの多くは一意の主キー値を持っていないため(実際には、実際に保存する予定のない「メモリ内」オブジェクトであるため、キー値が入力されていないため、エンティティに追加するときに「重複キー例外」エラーを回避するために追加の作業を行う必要がありますマネジャー。

切り離されたエンティティの元の値をクリアできる他の方法はありますか? それとも、AcceptChanges のようなものが切り離されたエンティティに対しても機能しない場合、切り離されたエンティティは最初から元の値を追跡する必要がありますか? それとも、複製されたエンティティは、そのソースの元の値を「継承」してはならないのでしょうか? 私はこれらの可能性のどちらについても強い意見を持っていません...エンティティをシリアル化できるようにしたいだけです。

私たちのアプリは、DevForce 2012 v7.2.4.0 を実行する Silverlight クライアントです。

4

1 に答える 1

0

デタッチされたエンティティの正しい動作に飛び込む前に、バックアップして、例外を引き起こしているのが実際に OriginalValuesMap であることを確認したいと思います。OriginalValuesMap の内容は、DataContractSerializer の通常のルールに従う必要があるため、DataMember 以外のアイテムはシリアル化されないと思います。これらの問題エンティティの 1 つをテキスト ファイルにシリアライズして、IdeaBlade サポートに送信してみてください。SerializationFns.Save(entity, filename, null, false) を使用して、アイテムをすばやくシリアル化できます。OriginalValuesMap に含まれてはならないものが含まれているように見える場合は、関連する型定義も必要になります。

于 2014-09-12T23:32:42.303 に答える