2010-11-02 119 views
2

所以我已经得到这种感觉,我应该关闭延迟加载,原因有二:我应该关闭实体框架中的延迟加载吗?

  1. 查询成为非原子,因此可能会导致并发性错误。
  2. 我或其他程序员可能最终导致巨大的性能障碍。

当然,只要我们小心,这两个问题都可以避免,但在性能稍微重要的项目中似乎有点不必要的风险。

作为一个附注,我发现奇怪的是,1- *关系属性变成null,而不是在您通过延迟加载关闭时访问它们时抛出异常。我想回去做所有事情,但是我担心我可能会忽略一个错误,我将一个尚未加载的0- *关系解释为null

想法?

回答

6

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

就个人而言,我们关闭延迟加载,并明确允许通过接口的合同中包含的导航性能,为我们的资料库,如:

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

所以我们再渴望负荷导航性能只有在调用代码明确要求的情况下。这就像是在对代码说:“嘿,如果你想得到关于这个T的额外信息,那么问ASK,否则你就不会这么做!”。

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

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

+0

这是一个很棒的想法,将包含作为字符串[]传入。关于空引用,我的意思是1-0关系,即对零或一个对象的引用。我认为这些可能是模棱两可的。谢谢! – 2010-11-02 12:18:42

+1

不用担心。此外,通过使用includes,您可以通过传递一个“enum”数组而不是字符串,为通常硬编码的'.Include'代码添加一些类型安全性。然后为该枚举创建一个扩展方法,该枚举将枚举转换为'.Include'字符串。这就是我们所做的。所以我们的代码如下所示:'repository.FindSingle(1,PersonAssociations.Orders)'。只是一个奖金提示,免费:) – RPM1984 2010-11-02 20:35:15

+0

是的,我在想,但我发现自己懒惰,因为如果你给它一个不正确的参数,EF会抛出一个异常。 – 2010-11-02 23:46:06

相关问题