1

現在、次のようなデータベースがあります

Person Table
Id
Name
AddressLookupTypeId


AddressLookupType Table
Id
Description
SortOrder

エンティティ フレームワーク 4.0 のデザイナーを使用して 2 つのテーブルを追加すると、両方のクラスでナビゲーション プロパティが取得されます。

Person Class
Id
Name
AddressLookupType - Nav Property


AddressStatusLookup Class
Id
Description
SortOrder
Person - Navigation Property

現在、個人テーブルには約 300 万以上のレコードがあり、住所タイプには約 50 程度のレコードしかありません。誰かのステータスを更新し、何らかの理由で変更の保存を呼び出すと、更新に永遠に時間がかかります。コード実行の途中で一時停止してデバッグすると、FixupAddressStatusLookup というメソッドになります。ここで何が起こっているのか正確にはわかりませんが、同じ addressstatustype を持つ Person レコードのサブセットをループしているように見えます。それは私の最善の推測です。デザイナーで AddressStatusLookup クラスから Person ナビゲーション プロパティを削除すると、コードはすぐに実行されます。ここで何が起こっているのか、誰か説明できますか? AddressStatusLookup で Person へのナビゲーション プロパティを設定すると、このような遅延が発生するのはなぜですか?

ありがとう

4

3 に答える 3

2

修正方法はおそらく次のようになります。

private void FixupAddressStatusLookup(AddressStatusLookup previousValue)
{
    if (previousValue != null && previousValue.Persons.Contains(this))
    {
        previousValue.Persons.Remove(this);
    }

    // more ...
}

AddressStatusLookupこれは、クラスのナビゲーションプロパティのセッターで呼び出されますPerson

ここで、遅延読み込みを有効AddressStatusLookupにして、エンティティにnewを割り当てたとしますPerson(setterが呼び出されるため、fixupメソッドが呼び出されます)。previousValue.Persons.Something...遅延読み込みにより、データベースに対してクエリが実行され、AddressStatusLookup値のpreviousValueあるすべての人が読み込まれます。数百万の人とわずか50のステータスで、以前に読み込まれた数千または数十万の人のレコードのリストがまったく削除さContainsれます。

これらの自動生成された修正方法が、このような問題を引き起こすことなく遅延読み込みとどのように互換性があるのか​​わかりません。

問題を解決するには、次のことを試してください。

  • Personクラスからコレクションを削除しますAddressStatusLookup(すでに成功を収めているため)。とにかくその有用性には疑問があります。
  • または:遅延読み込みを使用しないでください
  • または:生成されたクラスから修正メソッドを削除します。(おそらく、T4テンプレートを微調整し、カスタムテンプレートを作成して、そもそもこれらのメソッドの生成を抑制することは可能ですが、よくわかりません。)

(遅延読み込みを有効にしていない場合、この回答はおそらく完全に役に立たないでしょう。)

于 2011-06-15T18:21:22.530 に答える
1

T4 POCO テンプレートを使用しているようですね。その場合、表示されているのは、一方の端から他方の端までの関係を修正する実行中の FixUp コードです。逆方向ポインターがすべて正しく設定されていることを確認するために、リレーションシップの多くの端をトラバースするため、基本的に、私が見つけた重要なデータベースでは機能しません。あなたができる最善のことは、 context.ContextOptions で LazyLoading をオフにし、必要なときに Include などでリレーションシップをロードすることです。

編集:何が起こっているのかについてのもう少しの説明は、ここにありますhttp://blogs.msdn.com/b/efdesign/archive/2010/03/10/poco-template-code-generation-options.aspx

また、ADO.NET SelfTrackingEntity Generator によって生成されたオブジェクトには遅延読み込みがないため、これも行わないでください。

于 2011-06-15T18:20:28.773 に答える
0

その特定の操作に対して、Context.ContextOptions.LazyLoadingEnabled = false; を設定します。保存が完了したら、trueにリセットします。

于 2014-10-06T13:00:40.703 に答える