【发布时间】:2018-03-22 20:13:15
【问题描述】:
“创建/编译”我的 DbContext 需要一段时间(3 分钟以上)。 Web 服务器在大约 5 秒后启动,但是当我对我的数据库进行第一次查询时,EF 2.0 必须在内存中“构建/创建/编译”数据库之类的,我想?下一个请求几乎是即时的。这是 DbContext 的 Database First 创建,数据库已经存在于 MSSQL 中并且有数据。 DbContext 包含大约 500 个具有关系的 DbSet。
有没有办法通过在运行 Web 服务器之前(在开发时)执行我的实体框架的 DbContext 的“创建(映射?)”来加快速度,创建它需要的文件/映射,所以第一个请求很快也是?
【问题讨论】:
-
Entity Framework Core 2.0 上还不存在延迟加载?每次启动应用程序,而不是每次请求。
-
如果您使用 IIS 托管,请查看以下内容:weblogs.asp.net/scottgu/… 或 codeproject.com/Articles/795265/… 否则,您的网络服务器可能支持类似的技术。无论如何,这是网络服务器必须启动的。在网络服务器决定之前,您的应用程序不会执行任何操作,因此无法仅在代码中执行此操作。
-
Web 应用程序本身在大约 5 秒后启动,这是可以接受的。这是通过 EF Core 2.0 进行的第一个查询,需要 3 分钟以上。如果我只显示一个 HTML 页面,它会在大约 5 秒后加载。如果我使用 ADO.NET 也是一样,查询会在 2 秒后显示。这是第一个查询(甚至是一个简单的 db.Articles.FirstOrDefault()),需要 3 分钟+,后续查询(任何查询)需要 100 毫秒左右。
-
是的,那又怎样?您需要在一些启动代码中发出您的第一个(虚拟)查询,而不是等待第一个用户请求。如果放到app启动中,启动会变得不可接受,所以需要放到独立于客户端的预热代码中
-
由于我正在尝试调试(在开发中),我想问这个“第一个虚拟查询”时间是否可以降低。因为可能 EF 正在引导自己,我问的是这个引导的结果是否可以被缓存,这样 EF 就不需要每次运行都重建整个引导,而是读取缓存的版本。
标签: c# entity-framework entity-framework-core