【问题标题】:EF .NET Core2 first time loading takes more timeEF .NET Core2 首次加载需要更多时间
【发布时间】:2019-10-23 06:13:04
【问题描述】:
我们开发了具有 600 多个模型类的 EF .NET Core2 应用程序。那里有很多 DBContext 类。 DB 在 AWS 环境中可用。没有可用的本地数据库。我们正在通过 webAPI 访问 EF。当我们第一次点击 API 时,加载大约需要 3 到 4 分钟。第二次开始,它按预期在 4 秒内加载。有什么方法可以减少加载时间。主要问题在于开发人员。他们正在修复错误。每次他们在处理问题时都等待 3 分钟加载。
此外,我们使用 ITextsharper 进行 PDF 工作。
我们禁用了 trackchanges。
//Adding DbContext
services.AddDbContext<EPMSDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("EPMSDB1")));
services.AddTransient(typeof(EPMS.Services.Authentication.IAuthenticationService), typeof(EPMS.Services.Authentication.AuthenticationService));
services.AddHttpContextAccessor();
第一次加载时必须在 30 秒内加载。
【问题讨论】:
标签:
c#
entity-framework
.net-core
delayed-execution
【解决方案1】:
第一次比较慢,因为 EF 正在配置表映射和上下文。这是总会发生的事情,但是您可以通过优化 dbcontext 来减少它,并且有几种方法,其中一种是将您的 db 上下文拆分为具有特定实体的多个 db 上下文,这种方式对应用程序来说不是那么繁重开始。
【解决方案2】:
EF6
您可以通过调用Initalize 来预先准备实体框架。
using( var context = (...) )
{
context.Database.Initialize(force: false);
}
EF 核心
在 EF Core 中 DatabaseFacade 不提供 Initialise() 并且我在 RelationalDatabaseFacadeExtensions 中找不到类似的东西。
您仍然可以进行蠕虫查询。
加载了什么
顺便说一句。这是使用 SQLite 提供程序在 .NET Core 3.0 中首次创建 DBContext 报告的内容。
using (var db = new BloggingContext())
-------------------------------------------------------------------
You may only use the Microsoft .NET Core Debugger (vsdbg) with
Visual Studio Code, Visual Studio or Visual Studio for Mac software
to help you develop and test your applications.
-------------------------------------------------------------------
Loaded '...\3.0.0\System.Private.CoreLib.dll'.
Loaded '...\netcoreapp3.0\EFGetStarted.dll'. Symbols loaded.
Loaded '...\3.0.0\System.Runtime.dll'.
Loaded '...\netcoreapp3.0\Microsoft.EntityFrameworkCore.dll'.
Loaded '...\3.0.0\netstandard.dll'.
Loaded '...\3.0.0\System.ComponentModel.dll'.
Loaded '...\3.0.0\System.Console.dll'.
Loaded '...\3.0.0\System.Threading.dll'.
Loaded '...\3.0.0\System.Runtime.Extensions.dll'.
Loaded '...\3.0.0\System.Text.Encoding.Extensions.dll'.
.NETCoreApp,Version=v3.0
Loaded '...\3.0.0\System.Collections.dll'.
Loaded '...\netcoreapp3.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll'.
Loaded '...\3.0.0\System.Collections.Concurrent.dll'.
Loaded '...\3.0.0\System.Linq.dll'.
Loaded '...\netcoreapp3.0\Microsoft.Extensions.DependencyInjection.dll'.
Loaded '...\netcoreapp3.0\Microsoft.Extensions.Logging.Abstractions.dll'.
Loaded '...\3.0.0\System.Diagnostics.DiagnosticSource.dll'.
Loaded '...\3.0.0\System.Linq.Expressions.dll'.
Loaded '...\netcoreapp3.0\Microsoft.EntityFrameworkCore.Abstractions.dll'.
Loaded '...\netcoreapp3.0\Microsoft.Extensions.Caching.Abstractions.dll'.
Loaded '...\3.0.0\System.Resources.ResourceManager.dll'.
Loaded '...\3.0.0\System.Reflection.Emit.Lightweight.dll'.
Loaded '...\3.0.0\System.Diagnostics.Tracing.dll'.
Loaded '...\3.0.0\System.ComponentModel.TypeConverter.dll'.
Loaded '...\3.0.0\System.Reflection.Emit.ILGeneration.dll'.
Loaded '...\3.0.0\System.Reflection.Primitives.dll'.
Loaded 'Anonymously Hosted DynamicMethods Assembly'.
Loaded '...\netcoreapp3.0\Microsoft.EntityFrameworkCore.Sqlite.dll'.
Loaded '...\netcoreapp3.0\Microsoft.Extensions.Logging.dll'.
Loaded '...\netcoreapp3.0\Microsoft.Extensions.Options.dll'.
Loaded '...\netcoreapp3.0\Microsoft.Extensions.Logging.Console.dll'.
Loaded '...\netcoreapp3.0\Microsoft.Extensions.Logging.Configuration.dll'.
Loaded '...\netcoreapp3.0\Microsoft.Extensions.Options.ConfigurationExtensions.dll'.
Loaded '...\netcoreapp3.0\Microsoft.Extensions.Primitives.dll'.
Loaded '...\netcoreapp3.0\Microsoft.Extensions.Configuration.Abstractions.dll'.
Loaded '...\netcoreapp3.0\Microsoft.Extensions.Configuration.dll'.
Loaded '...\3.0.0\System.Threading.Tasks.dll'.
Loaded '...\3.0.0\System.Runtime.InteropServices.RuntimeInformation.dll'.
Loaded '...\netcoreapp3.0\Microsoft.Extensions.Configuration.Binder.dll'.
Loaded '...\3.0.0\System.Threading.Thread.dll'.
Loaded '...\netcoreapp3.0\Microsoft.EntityFrameworkCore.Relational.dll'.
Loaded '...\3.0.0\System.Data.Common.dll'.
Loaded '...\3.0.0\System.ComponentModel.Primitives.dll'.
Loaded '...\3.0.0\System.Transactions.Local.dll'.
Loaded '...\3.0.0\System.Runtime.InteropServices.dll'.
dbug: Microsoft.EntityFrameworkCore.Infrastructure[10409]
An additional 'IServiceProvider' was created for internal use by Entity Framework. An existing service provider was not used due to the following configuration changes: configuration added for 'Core:UseMemoryCache', configuration added for 'Core:EnableSensitiveDataLogging', configuration added for 'Core:EnableDetailedErrors', configuration added for 'Core:ConfigureWarnings', configuration added for 'Sqlite'.
Loaded '...\3.0.0\System.ComponentModel.Annotations.dll'.
Loaded '...\3.0.0\System.Diagnostics.Debug.dll'.
Loaded '...\3.0.0\System.Private.Uri.dll'.
Loaded '...\3.0.0\System.Collections.Immutable.dll'.
Loaded '...\3.0.0\System.ObjectModel.dll'.
Loaded '...\netcoreapp3.0\Microsoft.Extensions.Caching.Memory.dll'.
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 3.0.0 initialized 'BloggingContext' using provider 'Microsoft.EntityFrameworkCore.Sqlite' with options: None