私はEF4を使用してASP.NET 4 Webアプリケーションを構築していると私はこのようなテーブルがある:EF4遅い連想アクセス
製品
属性Product_Attribute_Map
Product_Attribute_Mapですクロステーブル、多対多。したがって、Productは0または多くのAttributeを持つことができ、その逆もあります。コードで
私はこれを行う:
//Attribute a = new Attribute(); // Edit:
Attribute a = (from a in context.Attributes where a.AttributeID = 1 select a).First();
a.Name = "test";
Product.Attributes.Add(a);
が、私はこれが非常に遅くなり、問題に気づきました。 EF4はサーバー上でこのSQLを実行します。
SELECT
[Extent2].* FROM [dbo].[Product_Attribute_Map] AS [Extent1]
INNER JOIN [dbo].[Product] AS [Extent2] ON [Extent1].[ProductID] = [Extent2].[ProductID]
WHERE [Extent1].[AttributeID] = @p1
これはなぜこのようなことがわかりません。 10.000プロダクトにアトリビュートを割り当てると、これが悪いクエリになります。製品に属性を追加するのに5秒以上かかります...
どのようにしてEF4がすべての属性を選択するのを防ぐことができますか?そして、この製品の属性を選択するだけです。
ありがとう
編集:これはPOCO t4テンプレートのみを使用しています。 EntityObjectテンプレートにこの問題はありません。
EFがあなたの属性に 'Products'コレクションを移そうとしているようです。あなたのテーブルマッピングはどのように見えますか? – StriplingWarrior
遅延ロードがオンになっていますか?あなたはここでそれが欲しくないかもしれません。表示されたコードは役に立ちません。それなしで試してみてください。 –
遅延ロードがオンになっているため、SQLクエリが実行されています。オフにすると、他の既存のマッピングが保存時に削除されます(コレクションに含まれていないため) – peter