2014-09-22 185 views
0

我正在使用EF6與SQLCE數據庫與幾個表中有超過200K記錄每個。我想在這些表的一個更新的記錄,但不幸的是,更新過程是使用波紋管的方法很慢:實體框架更新100K記錄

var original = db.Users.Find(updatedUser.UserId); 

if (original != null) 
{ 
    original.BusinessEntityId = updatedUser.BusinessEntityId; 
    original.Email = updatedUser.Email; 
    original.EmployeeId = updatedUser.EmployeeId; 
    original.Forename = updatedUser.Forename; 
    original.Surname = updatedUser.Surname; 
    original.Telephone = updatedUser.Telephone; 

    db.SaveChanges(); 
} 

我嘗試第二種方法是實際從數據庫中獲得的所有記錄,然後做比較在內存中,通過以導致列表循環後更新數據庫:

foreach (var _data in comparedList) 
    { 
     using (var db = new MyContext()) 
     { 
      db.Users.Attach(data); 
      var entry = context.Entry(data); 
      entry.Property(p => p.Forename).IsModified = true; 
      context.SaveChanges(); 
     } 
    } 

有關使用EF更新記錄的有效方法你知道嗎?

編輯

我也用在Fastest Way of Inserting in Entity Framework他們最終導致了「商店更新,插入或刪除語句影響了意外的行數(0)。」的錯誤呈現技術。

+2

在完成更新所有記錄之前,不要調用SaveChanges()。 – 2014-09-22 19:14:36

+0

使用接受用戶標識作爲參數的存儲過程。它速度更快,並使用數據庫引擎進行批量更新。 – user3514987 2014-09-22 19:58:53

+1

我建議改變你的問題來完整地再現問題。然後ping我,我會重新打開帖子。 – 2014-09-22 21:40:16

回答

3

EF不適用於大規模更新 - 它專爲查詢和事務更新而設計(一次只能記錄幾條記錄)

如果您需要批量更新數據,則可以編寫一條SQL語句,用於執行所有更新或者使用像SSIS這樣的ETL工具。

+0

我知道這一點,但我正在尋找使用EF做最快的方法。 – Jim 2014-09-22 21:07:50