4

要するに質問:

コードがナビゲーション プロパティにアクセスし、要求されたデータがメモリに読み込まれず、遅延読み込みが無効になっている場合、EF に例外をスローさせる方法はありますか?

少し長い:

私は Entity Framework 4 (モデルが最初) を使用しており、遅延読み込みを無効にしています。以前は、次のようなコードを実行すると、コードは正常に実行されましたが、customer.Orders への呼び出しごとに新しい SQL クエリが実行されたため、速度が低下していました。

int totalValue = 0;
foreach(var customer in efContext.Customers)
    foreach (var order in customer.Orders)
        totalValue += order.Value;

私が取り組んでいるコード ベースにそのようなコードが導入されるのを防ぐために、遅延読み込みを完全に無効にしたかったのです。私が望んでいたのは、コードが customer.Orders を実行するときに、「エンティティが読み込まれていません。遅延読み込みがオフです。」という行に沿って何かを示す例外がスローされることです。ただし、注文が読み込まれていないため、注文のリストは単に空です。

遅延読み込みとは異なる方法で、この動作も問題になる可能性があると思います。すべての顧客が連絡先を持っていることを確認することを任された開発者は、次のようなものを書くことができます:

if (customer.Contact != null) 
    throw new BlablablaException("Customer lacks contact");

しかし、遅延読み込みが無効になっていると、customer.Contact は常に null になり、開発者は自分のコードが適切に機能すると考える可能性があります。確かに、彼は自分の仕事を適切に行い、両方のシナリオ (存在する連絡先、存在しない連絡先) をテストする必要がありますが、例外がスローされた場合ははるかに明確になります。

私の意見では、利用できないデータにアクセスしようとすると、Entity Framework が例外をスローせず、代わりに空のリストを返すのは奇妙に思えます。

この動作に説明はありますか? また、ナビゲーション プロパティが呼び出され、データが利用できない場合に EF に例外をスローさせる方法はありますか?

4

1 に答える 1

0

各エントリをテストして、ロードされていることを確認できます。

コレクションの場合:

model.Entry(customer).Collection(c => c.Customers).IsLoaded

コレクションではない場合:

model.Entry(customer).Reference(c => c.Customer).IsLoaded

ただし、コレクションがロードされているかどうかを心配するよりも、コレクションがロードされていることを保証して、反復する前にコレクションを熱心にロードしたほうがよいと思います。

foreach(var customer in efContext.Customers.Include(c => c.Orders))
于 2012-09-21T18:01:20.160 に答える