10

最初に EF5 データベースを使用します。コンテキストの作成時に、に設定ContextOptions.LazyLoadingEnabledしていtrueます。何かがそれを変更することがfalseあります (コードのどこにも設定が変更されていません)。

さまざまな時点で、このコード スニペット(エンティティ オブジェクトからコンテキストを取得)trueを使用して、まだ有効かどうかを確認しています。この問題は、複数のスレッドを実行している場合にのみ発生します (いくつかのエンティティをロードし、それらをマルチスレッド コードに渡します)。コード内の一貫したポイントでは発生しないため、原因を正確に特定することは不可能です。

誰かが EF の内部動作についてもっと知り、手がかりを教えてくれることを望んでいると思います...

4

2 に答える 2

1

Entity Framework コンテキストはスレッド セーフではありません。発生する問題は、複数のスレッドが遅延ロードされたプロパティにアクセスするときに発生します。内部的に、EF は NavigationProperty の値をチェックするときに遅延読み込みをオフにし、後でオンに戻します。( を参照RelatedEnd.DisableLazyLoading())

したがって、あなたのケースで起こっていることはおそらく次のようになります: 1 つのスレッドが現在 NavigationProperty にアクセスしており、それが終了する前に、別のスレッドが同じコンテキストにアタッチされたオブジェクトのナビゲーション プロパティにアクセスしようとしています。その時点で、遅延ロードは一時的にオフになり、データはロードされません。

EF は、ObjectContext がスレッド セーフではないことを明示的に示しているため、異なるスレッドからの同時アクセスが発生していないことを確認することをお勧めします。

于 2015-05-05T14:31:54.630 に答える
0

LazyLoadingEnabledナビゲーション プロパティにアクセスしたときに、関連するオブジェクトが自動的に読み込まれるかどうかを決定します。

Julie Lermans Book: Programming EF by Julie Lermanでこれを読んだことを覚えています。

遅延読み込みには動的プロキシが必要です。Virtual ナビゲーション プロパティを持つ Public クラスが必要です。

于 2013-05-19T14:34:42.333 に答える