实体框架4非常慢地将订单链接到拥有10,000个订单的客户

时间:2011-06-16 20:16:51

标签: entity-framework entity-framework-4

这个让我难过。

我有一个客户和订单实体。客户可以订购多个订单。

如果客户在创建新订单并设置客户属性(Order.Customer = customer)时有10,000个订单,则会有一个LONG延迟(20秒)。在添加这个新订单之前,上下文似乎正在加载所有10,000个订单。

我目前没有直接使用FK,我怀疑这可能有所帮助。

任何想法如何在没有大规模重构的情况下改善问题?

干杯。

2 个答案:

答案 0 :(得分:9)

问题很可能是您使用的是T4 POCO模板。此模板生成令人讨厌的修复方法,并在所有导航属性内部使用它们。如果您在一侧修改导航属性,则会触发fixup,它将尝试修改反向导航属性以使对象图形保持一致。这就是问题所在。一旦将Customer属性分配给Order实例,它将在Orders实例上修复Customer属性,但修复访问属性与任何其他代码一样,并触发所有客户订单的延迟加载。

只有很少的解决方案:

  • 使用外键关系并设置FK属性。这应该适用于插入但是为了更新它仍然可能导致问题,因为将FK属性设置为另一个值会将null设置为navigation属性,这将再次触发前一个父项的修复。
  • 关闭此操作的延迟加载 - 您很可能不需要它来创建新订单。
  • 修改模板并删除fixupus

答案 1 :(得分:1)

也许一种不同的方法可行。如果您有客户实例,请尝试:

customer.Orders.Add(new Order(){parameter1 = value1, parameter2=valu2, etc.})

现在不是@work,所以不要手动检查实体结构(使用项目的自跟踪实体)来查看是否有意义。但是,通过将其添加到订单集合中,实体可以解决订单与客户之间的关系,而无需获得此特定客户的所有其他10k订单。