延迟加载DbSet

时间:2015-04-11 14:21:26

标签: c# entity-framework

我看到人们在DbSet<T>班级中Lazy<T>包裹Lazy<DbSet<T>>。{{1}}。我只能在互联网上找到另一个this的人。

这样做有什么影响?

2 个答案:

答案 0 :(得分:3)

EntityFramework在内部避免做一些在启动时需要做的昂贵的引导程序,直到它知道它需要它为止。创建DbContext(以及其他)是触发EF内部一些可能代价高昂的活动的操作之一,这可能是(可能)该代码将其包装在Lazy中的原因,这样如果调用代码没有&#39}无论出于何种原因,都需要访问EF对象,它不会产生这样的费用。

本文对各种版本的EF启动性能有一些有用的了解:https://msdn.microsoft.com/en-gb/data/hh949853.aspx

在这种情况下(并且不知道GitHub代码背后的完整上下文所以这很大程度上是推测)似乎上下文的DbSet被包装在一个单独的Repository类中,这是相当不规范的FWIW。他们已将他们的DbContext定义为Lazy实例化(here),因此他们需要对DbSet用法执行相同的操作,以避免在存储库时急切地解析DbContext实例化。

答案 1 :(得分:1)

在这种情况下,Lazy<>中的包装上下文只是初始化它,直到第一次需要它并保持实例可用于存储库上的任何其他操作。它实际上只是DbContext的一个简单的线程安全单例。