我很困惑为什么这个代码不起作用,它应该在循环之后保存对数据库的更改但是当我将SaveChanges
方法放在循环中时,它将记录保存到数据库中但在它之外什么都不保存?它只有300~1000条记录
static bool lisReady = false;
static bool sacclReady = false;
static void Main(string[] args)
{
Logger("Starting services");
ConnectDBLis().Wait();
ConnectDBSaccl().Wait();
Thread.Sleep(1000);
if (lisReady & sacclReady){
//start
Logger("Services ready");
StartExport().Wait();
}
}
static async Task<bool> StartExport()
{
lis lisdb = new lis();
nrlsaccl saccldb = new nrlsaccl();
var getTestOrders = await lisdb.test_orders.ToListAsync();
Logger("Services starting");
foreach (var tO in getTestOrders.Where(x => x.entry_datetime.Value.Year == 2016))
{
foreach (var tr in tO.test_results)
{
foreach (var tL in tr.test_result_logs)
{
results_availability postResults = new results_availability
{
first_name = tO.patient_orders.patient.first_name,
middle_name = tO.patient_orders.patient.middle_name,
last_name = tO.patient_orders.patient.last_name,
birthdate = tO.patient_orders.patient.birthdate,
};
if (postResults.id == 0)
{
saccldb.results_availability.Add(postResults);
}
else
{
saccldb.Entry(postResults).State = EntityState.Modified;
}
}
}
}
await saccldb.SaveChangesAsync();
return true;
}
修改:
所以我将记录限制为100并且保存更改有效,瞬间3000条记录不起作用,任何解决方案?
答案 0 :(得分:0)
此代码并未完全解决您的问题,这是您的问题的一些考虑因素。
注意:这在添加1200条记录和300条修改时适用于我
static async Task<bool> StartExport()
{
using (var db = new Entities())
{
var appraisals = await db.Appraisals.ToListAsync();
db.Database.CommandTimeout = 300;
//Disabling auto detect changes enabled will bring some performance tweaks
db.Configuration.AutoDetectChangesEnabled = false;
foreach (var appraisal in appraisals.Where(g => g.Id > 1))
{
if (appraisal.Id == 10)
{
appraisal.AppraisalName = "New name";
db.Entry(appraisal).State = EntityState.Added;
}
else
{
appraisal.AppraisalName = "Modified name";
db.Entry(appraisal).State = EntityState.Modified;
}
}
db.Configuration.AutoDetectChangesEnabled = true;
if (await db.SaveChangesAsync() > 1)
return true;
else
return false;
}
}
您可以使用
db.Database.CommandTimeout = 300;
来增加连接的超时时间。实体框架6提供
AddRange()
这将一次性插入项目,它将禁用AutoDetectChangesEnabled
并插入实体
在你的情况下,你不想将这些标记标记为已修改,EF已经很好地跟踪了它。 Entity Framework - Why explicitly set entity state to modified?
更改跟踪的目的是找到您已更改附加实体的值并将其置于修改状态。在分离的实体(加载的实体没有更改跟踪或在当前上下文之外创建)的情况下,手动设置状态非常重要。
这里我们将所有实体附加到上下文本身
答案 1 :(得分:0)
使用
saccldb.SaveChanges()
仅仅因为等待saccldb.SaveChangesAsync()的异步性质导致您的线程继续并在保存到db完成之前退出该函数。在你的情况下,它返回true。
我建议不要在控制台应用程序上使用任何异步操作,除非它有一个你想继续使用的用户界面。