我正在使用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模板没有这个问题。
答案 0 :(得分:1)
我的猜测:这是因为LazyLoading与POCO模板生成的FixUpCollections一起使用。当您向产品添加属性时,fixup集合也将执行反向操作 - 它将向属性添加产品,但首先访问属性中的产品集合将触发延迟加载,因此您的查询将被执行。我不喜欢fixup集合...您可以修改POCO模板以不使用它们,或者您可以删除Attribute中的Products导航属性(如果您不需要它)。