2011-02-07 2 views
3

Я строю веб-приложение ASP.NET 4 с помощью EF4 и у меня есть таблицы, как это: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 всех атрибутов? И просто выберите атрибуты для этого продукта.

Благодаря

Edit: Это только с помощью шаблона t4 POCO. У шаблона EntityObject нет этой проблемы.

+0

Похоже, что EF пытается заполнить коллекцию 'Продукты' по вашему атрибуту. Как выглядит ваше табличное сопоставление? – StriplingWarrior

+0

Включена ли ленивая загрузка? Вы можете не хотеть этого здесь. Это не поможет показанному коду. Попробуйте это. –

+0

Включена ленивая загрузка, это вызывает выполнение SQL-запроса. Если я отключу его, другие существующие сопоставления будут удалены при сохранении (потому что они не находятся в коллекции) – peter

ответ

1

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

+0

Знаете ли вы, какие недостатки устраняют операции фиксации? – peter

+0

@peter: вы потеряете двунаправленную синхронизацию отношений. Ваш код не должен зависеть от них. Если вы добавляете атрибут к продукту, и вы также хотите использовать обратное направление перед сохранением изменений, вы должны вручную добавить товар в атрибут. Вы можете определить свои собственные объекты POCO (обычно используемые в коде), которые не используют коллекции FixUp, поэтому они работают без них. –

+0

Удаление исправлений не устранило проблему, к сожалению. Однако ваш совет по удалению свойства навигации Products из атрибута делает его намного быстрее. Думаю, я сохраню это. Но это для меня проблема, почему EntityObject T4 не имеет этой проблемы. – peter

Смежные вопросы