我正在使用EF4构建ASP.NET 4 Web应用程序,并且具有如下表格:
产品
属性
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模板没有此问题。
最佳答案
我的猜测:发生这种情况是由于LazyLoading与POCO模板生成的FixUpCollections一起使用。当您向产品添加属性时,fixup集合也会执行反向操作-它将向产品添加产品,但是对属性中产品集合的首次访问将触发延迟加载,因此将执行查询。我不喜欢修正集合...您可以修改POCO模板以不使用它们,也可以删除“属性”中的“产品”导航属性(如果不需要)。
关于asp.net - EF4慢速关联访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4926864/