2013-04-30 49 views
4

我想用一個循環記錄實體框架這樣的更新:例外:對象無法連接,因爲它已經在對象上下文

var data = userDetails.users.Where(x => x.IsAnonymous == true); 

foreach(var item in data) 
{ 
    var updatedData = db.Users.FirstOrDefault(x => x.UserId == item.UserId); 
    updatedData.IsAnonymous = true; 
    db.Users.Attach(updatedData); 
    db.ObjectStateManager.ChangeObjectState(updatedData, EntityState.Modified); 
    db.SaveChanges();  
} 

雖然附加(db.Users.Attach(updatedData);)我有例外

該對象無法附加,因爲它已經在對象上下文中。對象只能在處於未更改狀態時才能重新連接

如何解決此錯誤?

回答

5

如果這種情況發生在單個DbContext(或ObjectContext)的環境中 - 只需選擇記錄,更新所需的字段並繼續。一旦你更新了所有記錄 - 然後請致電.SaveChanges()一次。無需AttachChangeObjectState電話.....

var data = userDetails.users.Where(x => x.IsAnonymous == true); 

foreach(var item in data) 
{ 
    var updatedData = db.Users.FirstOrDefault(x => x.UserId == item.UserId); 

    if(updatedData != null) 
    { 
     updatedData.IsAnonymous = true; 
    } 
} 

db.SaveChanges();  

既然你剛纔選擇updatedDatadb.Users組數據 - 這已經是對象集的一部分 - 無需重新插入!只需更新你需要的東西,並撥打.SaveChanges()(最好一次爲整批 - 不是每個記錄一次...)

+2

它的作品就像一個魅力。 – StepUp 2015-01-09 01:12:36

相關問題