我有这种代码,我试图用内存ef核心数据库进行单元测试。
public async Task<int> UpdateHistoricalWeatherDataAllLocationsAsync()
{
var regions = DalContext.Region.ToList();
var allInsertAmounts = new List<int>();
foreach (var region in regions)
{
var startDate = DateTime.Now.AddYears(-3);
var endDate = DateTime.Now;
while (startDate < endDate)
{
// Hit Api
HttpResponseMessage res= await HitApi(region, batchStartDate, batchEndDate);
var parsedResult = await ParseResultToStrongType(apixuResponse);
var recoredsInserted = await WriteToDb(parsedResult, region, batchStartDate, batchEndDate);
allInsertAmounts.Add(recoredsInserted);
startDate = startDate.AddDays(30);
}
}
return allInsertAmounts.Count();
}
所以我循环一些区域和foreach循环一些日期范围。
我点击api,解析结果,将其发送到保存它的函数。执行此代码的速度非常慢。
以下是使用的方法
private async Task<HttpResponseMessage>HitApi(Region region, DateTime startDate, DateTime endDate) {
return await Client
.GetAsync(somestring);
}
private async Task<ApiResponse> ParseResultToStrongType(HttpResponseMessage httpResponse) {
var responseBody = await httpResponse.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<ApiResponse>(responseBody);
}
private async Task<int> WriteToDb(ApiResponse apiData, Region region, DateTime batchStartDate, DateTime batchEndDate) {
var batch = new List<Thing>();
foreach (var data in apiData.list) {
var thing= new Thing {
// pull the properties out
};
batch.Add(newHistoricalWeather);
}
DalContext.Thing.AddRange(batch);
DalContext.SaveChanges();
}
由于某种原因,等待SaveChangesAsync非常慢,所以我改为非异步,这似乎改善了问题。但我不确定为什么开始这么慢......
对于89个地区,每个地区每月批量约为3年,平均每个国家有5个地区,我(89 * 36)= 3204次运行保存变更,这看起来并不多。每个都涉及插入30条记录,总共96,000条记录。
是的,它在内存中,是的,它是在异步方法中的一个循环中,在我们甚至可以执行写操作之前调用并等待2个异步方法,但是现在仍需要20多分钟来运行此测试。
是因为它是内存数据库吗?
最后我仍然不知道等待ef核心保存方法的速度比同步版本要慢。但我能够确定问题是内存数据库。我不再使用它,因为我的测试涉及大型结果集 - 我使用真正的测试数据库..