【问题标题】: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 秒内加载。

【问题讨论】:

  • 您是否在模型中为您的关系使用虚拟属性?
  • 没有。我们正在使用模型优先方法。
  • 是上下文初始化需要4分钟还是第一次查询?
  • 第一个查询需要 4 分钟才能显示答案。

标签: 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
    

    【讨论】:

      猜你喜欢
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      相关资源
      最近更新 更多