增加实体框架连接和查询

时间:2017-02-08 16:03:17

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

我的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

你能帮我解决我做错的事吗?

2 个答案:

答案 0 :(得分:0)

我不会创建一个静态工厂来返回Context。 A&#39; context&#39;实体框架(EF)是数据库的开头。在为不同的查询重用相同的连接时,可能会遇到麻烦。一般情况下,静态对于公共静态添加(int x,int y){返回x + y}等内容的核心业务使用非常有用。但是对于像数据访问这样的东西我避免它们并且支持基于实例。也许我错了,更多高级EF专家会进来解释一下。但通常情况下,我总是通过包装事务范围来处理我的上下文,其中包含所有内容:

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

我在专业使用EF的公司的工作经验。如果他们试图使用IOC来获得EF共享的静态或实例,那么随着时间的推移它会变得混乱。当你坚持打开,建立连接,做某事,通过使用“使用{}&#39;块来自动处理它”时,它表现得更好。

答案 1 :(得分:0)

我终于通过添加到我的startup.cs解决了这个问题:

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

所以我的db contexte现在看起来像这样:

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

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

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