2016-04-19 130 views
4

我很困惑,为什么这段代码不工作,它应该在循环后保存对数据库的更改,但是当我将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

'savechangesasync'有任何错误。我已经在我的本地复制了上面的代码,似乎对我来说工作正常 – Eldho

+0

@Eldho我没有收到任何错误,我在savechanges上放置了一个断点,它能击中它,你能告诉我你的代码吗? –

回答

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并且已经插入实体

你的情况,你不想来标记的entites的修改,EF跟踪它。 Entity Framework - Why explicitly set entity state to modified?

更改跟踪的目的是发现您已更改附加实体的值并将其置于修改状态。手动设置状态对于分离的实体很重要(实体在没有更改跟踪的情况下加载或在当前上下文之外创建)。

这里我们附上所有实体上下文本身

+0

尝试添加范围,因为你建议,但它仍然没有保存.... –

+0

我怀疑那里是另一回事是问题。使用ef和上面的代码我可以插入3000条记录。使用'SaveChanges'而不是'Aync'并寻找错误 – Eldho

+0

在调试时没有错误:( –

0

使用

saccldb.SaveChanges() 

很简单,因为的异步性质等待saccldb.SaveChangesAsync()导致您的线程继续之前退出功能保存到数据库完成。在你的情况下,它返回true。

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

+0

你好我已经试过了,它还没有保存... –