2013-03-14 50 views
2

爲什麼DbContext ctx在每個SaveChanges()執行後更快處置?EF SaveChanges優化?

首先樣品:

var ctx = new DomainContext(); 
foreach (var item in deals) 
     { 
      DealsOfReutersAddition newDealAddition = 
         new DealsOfReutersAddition 
         { 
          DealsOfReutersId = item.DealsOfReutersId, 
          DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")), 
         }; 
      ctx.DealsOfReutersAdditions.Add(newDealAddition); 
      ctx.SaveChanges(); 
     } 

ctx.Dispose(); 

第二樣品:

foreach (var item in deals) 
     { 
      DealsOfReutersAddition newDealAddition = 
         new DealsOfReutersAddition 
         { 
          DealsOfReutersId = item.DealsOfReutersId, 
          DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")), 
         }; 
      var ctx = new DomainContext(); 
      ctx.DealsOfReutersAdditions.Add(newDealAddition); 
      ctx.SaveChanges(); 
      ctx.Dispose(); 
     } 

在1000行中第一估計8秒aganist 140秒第二樣品。 任何方式來清潔ctx,而不是重新創建?

+2

我也只會調用'SaveChagnes'一旦這種工藝優化代碼。外環 – 2013-03-14 13:02:34

+0

它估計在4.8秒 – FreeVice 2013-03-14 13:32:15

+0

那麼你應該適當地做到:) – 2013-03-14 13:33:29

回答

3

沿着@JensKloster在評論中所說的話,你肯定不希望在循環中每一次都打電話SaveChanges。但我實際上會抵制把它放在循環之外的誘惑。由於上下文跟蹤的對象數量越來越多,更多的內存將用完,並且會使增量緩慢。

我對你的解決方案,那麼,就是在循環運行的計數器,以確定你會做保存:

int numberOfRecords = 0; 
using(var ctx = new DomainContext()) 
{ 
    foreach (var item in deals) 
      { 
       DealsOfReutersAddition newDealAddition = 
          new DealsOfReutersAddition 
          { 
           DealsOfReutersId = item.DealsOfReutersId, 
           DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")), 
          }; 

       ctx.DealsOfReutersAdditions.Add(newDealAddition); 

       numberOfRecords++; 
       if(numberOfRecords % 500 == 0) //Saves after every 500 rows. 
       { 
       ctx.SaveChanges(); 
       } 
      } 
} 
+0

節省一次將在所有情況下更快。保存不會釋放內存AFAIK。真正的竅門是使用每批處理上下文的方法。 – usr 2013-03-14 15:53:02

+1

什麼會更好是你調用SaveChanges後ctx.Dispose(); ctx = new DomainContext(); – 2013-03-15 08:33:13