Я строю веб-приложение 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 нет этой проблемы.
Похоже, что EF пытается заполнить коллекцию 'Продукты' по вашему атрибуту. Как выглядит ваше табличное сопоставление? – StriplingWarrior
Включена ли ленивая загрузка? Вы можете не хотеть этого здесь. Это не поможет показанному коду. Попробуйте это. –
Включена ленивая загрузка, это вызывает выполнение SQL-запроса. Если я отключу его, другие существующие сопоставления будут удалены при сохранении (потому что они не находятся в коллекции) – peter