实体框架不将更改保存到数据库中

时间:2016-04-19 02:55:10

标签: c# mysql entity-framework entity-framework-6

我很困惑为什么这个代码不起作用,它应该在循环之后保存对数据库的更改但是当我将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条记录不起作用,任何解决方案?

2 个答案:

答案 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。

我建议不要在控制台应用程序上使用任何异步操作,除非它有一个你想继续使用的用户界面。