我应该关闭实体框架中的延迟加载吗?

时间:2010-11-02 08:11:39

标签: entity-framework linq-to-entities lazy-loading

所以我一直觉得我应该关闭延迟加载,原因有两个:

  1. 查询变为非原子,因此可能导致并发错误。
  2. 我或其他程序员可能最终导致巨大的性能障碍。
  3. 当然,只要我们小心,这两个问题都可以避免,但在性能有些重要的项目中似乎有点不必要的风险。

    作为旁注,我发现1- *关系属性变为null而不是在延迟加载时访问它们时抛出异常是很奇怪的。我想回过头来处理单个查询中的所有内容,但我担心我可能忽略了一个错误,即我将一个尚未加载的0- *关系解释为null

    思想?

1 个答案:

答案 0 :(得分:6)

如果您不担心表现,请关闭延迟加载。

就个人而言,我们关闭延迟加载,显式允许通过我们的存储库的接口契约包含导航属性,例如:

ICollection<Person> FindSingle(int personId, string[] includeAssociations);

因此,只有在调用代码专门请求时,我们才会急切加载导航属性。这就像是在对代码说:“嘿,如果你想要关于这个T的额外信息,那就请它,否则你就不会开始了!”。

对于1- *,当然属性为null。导航属性通常在对象上实现为ICollection<T>,因此如果没有任何内容,则不会实例化集合。

可以通过在执行查询时创建一个空集合而不是null集合来抵消这种效果。但是,我更喜欢将null集合添加到具有0个项目的实例化集合中。