创建实体框架对象会导致长时间运行的查询

时间:2014-04-23 16:28:04

标签: c# sql entity-framework

我有一个数据库架构,其中包括表Orders,Options [Id,OptionGroupId,...],OrderOptions [Id,OptionId]和一个关联表OrderSheetOptions [OrderSheetId,OrderOptionId]。

我的C#代码正在创建OrderOption EF对象(映射到数据库表的对象):

    // Select all default options
    var options = Sheet.OptionGroups.Select(og => og.Option);

    foreach (var option in options)
    {
        // Add all default options
        OrderOptions
            .Add(new OrderOption
                {
                    Option = option
                });
    }

问题似乎出现了,因为我在创建OrderOption时设置了Option属性。这导致EF运行此查询:

exec sp_executesql N'SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[OptionId] AS [OptionId]
FROM [dbo].[OrderOptions] AS [Extent1]
WHERE [Extent1].[OptionId] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1

每个订单都有一个OptionId = 1的默认OrderOption,因此从上面的查询中可以看出,每个记录都会被返回。随着这个表的增长,这个查询变得非常缓慢并且严重影响了网站用户体验 - 延迟了几分钟。

我通常只添加3条记录,因为这些是默认选项。我已经为OrderOptions添加了一个索引,但它没有帮助,因为该表中的每个记录都有一个OptionId = 1,因此自动EF查询返回所有记录。

看起来EF正在查询整个OrderOptions表以确保没有创建重复的对象,但OrderOption是特定于Order的,因此它只需要担心当前的订单。但是,期权与订单没有直接联系;仅通过OrderSheetOptions间接进行。因此,EF查询不能将自己限制为当前订单。任何人都可以告诉我如何优化这一点,以便EF不必查询整个OrderOptions表只是为了添加新项目吗?

谢谢!

0 个答案:

没有答案