我看到人们在DbSet<T>
班级中Lazy<T>
包裹Lazy<DbSet<T>>
。{{1}}。我只能在互联网上找到另一个this的人。
这样做有什么影响?
答案 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的一个简单的线程安全单例。