我的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
你能帮我解决我做错的事吗?
答案 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;