EF4 медленный доступ к ассоциации - PullRequest
3 голосов
/ 08 февраля 2011

Я создаю веб-приложение ASP.NET 4, используя EF4, и у меня есть такие таблицы:

Продукт
Атрибут

Product_Attribute_Map

Product_Attribute_Map - это кросс-таблица, многие ко многим. Таким образом, продукт может иметь ноль или несколько атрибутов и наоборот.

В коде я делаю это:

//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 не имеет этой проблемы.

1 Ответ

1 голос
/ 08 февраля 2011

Мое предположение: это происходит из-за LazyLoading, используемого вместе с FixUpCollections, сгенерированным шаблоном POCO.Когда вы добавляете атрибут к продукту, коллекция исправлений также выполнит обратную операцию - добавит prduct к атрибуту, но первый доступ к коллекции продуктов в атрибуте приведет к отложенной загрузке, и ваш запрос будет выполнен.Мне не нравятся коллекции исправлений ... Вы можете изменить шаблон POCO, чтобы они не использовались, или удалить свойство навигации по продуктам в Атрибуте (если оно вам не нужно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...