0

EF STE オブジェクト グラフをシリアル化しようとしているときに StackOverflowException に関して以前に書いた投稿の「製図板」に戻りました...ここで説明されているように、IIS7 でスタック サイズを正常に調整できなかった後、私は行くことにしました根本原因を調べる道をたどる...

これは、EF モデルの設計方法に関係していると思います。

簡単に言うと、親エンティティと子エンティティがあります。Child エンティティには、Child.Parent と Child.ParentUsed など、親に戻る 2 つのナビゲーション プロパティがあります。当然、親には 2 つの子コレクションがあります。

StackOverflow 例外の原因となっているデータを詳しく調べたところ、このオブジェクト グラフにはいくつかのサイクルがあることに気付きました。それを証明することはできませんが、サイクルがこの StackOverflow 例外を引き起こしていることはかなり確信しています。

データベースのこのテーブルのデータを削除すると、問題は解決しますが、顧客のマシンのレコードを削除することはできません。設計が悪いかどうかにかかわらず、何らかの形で EF レベルでこれを回避する必要があります。

これを作り直すためのオプションは何ですか? 私の子オブジェクトが親に​​戻るナビゲーション プロパティを持たず、代わりに 2 つの int Fk を持っていた場合、シリアライゼーションがチョークするサイクルが発生するのではないでしょうか? 1 つのエンティティでナビゲーション プロパティを Fks に変更する方法はありますか?

ありがとう!

アップデート:

子の両方のナビゲーション プロパティを削除して親に戻すと、この問題は解決します。必ずしもサイクルの問題ではないと思いますが、参照をチェックしてサイクルを決定しようとしてスタックが使い果たされている可能性があります。

必ずしも nav プロパティを削除したいわけではありません。それらはクライアントで役立ちます。これを修正するより良い方法はありますか?カスタムシリアライズ?

4

1 に答える 1

1

WCF で EF のパフォーマンスをテストしていたときに、同様の問題が発生しました。クエリの結果セットが 3000 件を超えると、StackOverflow が発生しました。

ナビゲーション プロパティの1 つだけを削除すると、StackOverflow は消滅します。サイクルがどこで発生するかを説明しようとしますが、DataContractSeriazer を使用してグラフをファイルにシリアル化することもできます。生成された XML を確認した瞬間に何が問題なのかがわかります。

各オブジェクトは一度だけシリアライズされますが、シリアライズは深さ優先です。例としてあなたのシナリオを取り上げます:

1 - 親 1 をシリアライズする

2 - ChildList1 の最初の要素をシリアライズする

3 - ここで、parent1 との関係を持つオブジェクト Child1 をシリアル化しています (既にシリアル化されているため、Ref が使用されます)。したがって、ParentUsed をシリアル化します (別のオブジェクト、parent2、他の子との関係がさらにあります) - 親 2 のステップ 1 に進みます。

親のリストがロードされ、(レコード間の) 関係の複雑さが十分に大きい場合、シリアライザーはすべてのグラフを最初の要素の「子」として (再帰的に) シリアライズしようとします。ナビゲーション プロパティの1 つを削除して親に戻すと、残りのナビゲーション プロパティが常にシリアル化された親を参照するサイクルがなくなります。

UI へのバインドにナビゲーション プロパティのみを使用する場合は、複数の BindingSource (私は WinForms に慣れています) と FK を使用して関係を作成し、ナビゲーション プロパティと同じ結果を得ることができます (ただし、より多くの作業が必要になります)。

お役に立てれば、

ヌノ・ペレイラ

于 2012-07-09T21:44:12.977 に答える