【问题标题】:Increasing entity framework connections and queries增加实体框架连接和查询
【发布时间】:2017-02-08 16:03:16
【问题描述】:

我的 dotnet 核心项目与实体框架核心和 mysql 连接器存在性能问题。

我按照以下教程创建了 dbcontext:http://insidemysql.com/howto-starting-with-mysql-ef-core-provider-and-connectornet-7-0-4/

    public class MhdContext : DbContext
    {
        public MhdContext(DbContextOptions<MhdContext> options) : base(options) { }

        public DbSet<Vehicle> Vehicles { get; set; }
    }

    public static class MhdContextFactory
    {
        public static MhdContext Create(string connectionString)
        {
            var optionsBuilder = new DbContextOptionsBuilder<MhdContext>();
            optionsBuilder.UseMySQL(connectionString);

            //Ensure database creation
            var context = new MhdContext(optionsBuilder.Options);
            context.Database.EnsureCreated();
            var serviceProvider = context.GetInfrastructure<IServiceProvider>();
            var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
            loggerFactory.AddProvider(new MyLoggerProvider());

            return context;
        }
     }

在我的控制器中,我调用了这个方法:

    public async Task<Vehicle[]> GetAllVehicles()
    {
        _logger.LogInformation("Getting All vehicles");
        using (var dbContext = MhdContextFactory.Create(_dbConfig.ConnectionString))
        {
            var vehicles = await dbContext.Vehicles.AsNoTracking()
                .FromSql("SELECT * FROM Vehicles AS v group by v.VehicleId order by LastUpdate")
                .ToArrayAsync();
            return vehicles;
        }
    }

在第一次请求之后,一切看起来都正常

在几次请求之后,有重复的 sql 命令并增加 第 7 次请求日志:https://www.dropbox.com/s/2ezyowyubq1orsn/7thRequest.txt?dl=0

你能帮我解决我做错了什么吗?

【问题讨论】:

    标签: mysql entity-framework asp.net-core


    【解决方案1】:

    我不会创建一个静态工厂来返回上下文。实体框架(EF)中的“上下文”是对数据库的开放。如果您为不同的查询重用相同的连接,您可能会遇到麻烦。一般来说,静态非常适合公共静态 Add(int x, int y){ Return x + y } 之类的核心业务使用。但是对于像数据访问这样的事情,我避免使用它们并喜欢基于实例。也许我错了,一些高级 EF 专家会进来解释一下。但通常我总是通过包装一个事务范围来处理我的上下文,其中所有内容都包含在其中:

    (var context = new EFContext()) // NOT BASED ON FROM A STATIC FACTORY
    {
      //Do some DB operation
    }
    

    根据我在专业使用 EF 的公司的工作经验。如果他们试图使用 IOC 来共享 EF 的静态或实例,它会随着时间的推移而变得混乱。当您坚持只打开、建立连接、做某事、通过 DISPOSING 关闭它(使用 'using { }' 块自动处理)时,它的表现会更好。

    【讨论】:

      【解决方案2】:

      我终于通过在我的 startup.cs 中添加这个来解决这个问题:

          public void ConfigureServices(IServiceCollection services)
          {
              services.AddDbContext<MhdContext>(
                  options => options.UseMySQL(
                      Configuration.GetConnectionString("MysqlConnection")));
          }
      

      所以我的数据库上下文现在看起来像这样:

          public MhdContext(DbContextOptions<MhdContext> options) : base(options {}
      

      在我的控制器中,我得到了依赖注入的实例:

          var dbContext = _serviceProvider.GetService<MhdContext>();
          return dbContext.Vehicles;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-08
        • 1970-01-01
        • 1970-01-01
        • 2020-10-06
        • 2011-04-08
        • 1970-01-01
        • 2014-11-25
        • 1970-01-01
        相关资源
        最近更新 更多