2016-11-14 16 views
1

我有這個簡單的代碼:由於會話中還有其他線程正在運行,因此不允許新的事務。實體框架

foreach(var myvar in _sdb.Vars) 
{ 
    myvar.Area= AreaCheck(myvar); 

    _sdb.Entry(myvar).State = System.Data.Entity.EntityState.Modified; 
    _sdb.SaveChanges(); 
} 

當我運行這段代碼我得到這個異常:

新的事物是不允許的,因爲有其他線程 在會話中運行。

我GOOGLE了這個問題,其中一個答案告訴我要改變這一行:

foreach(var myvar in _sdb.Vars) 

這一行:

foreach(var myvar in _sdb.Vars.ToList()) 

但是,當我做到了,代碼沒」根本不工作。我該如何做這項工作?謝謝。

+1

'在_sdb.Vars' VAR MYVAR將拋出錯誤爲'sdb.Vars'是迭代'IQueryable'和你試圖修改它的狀態。 'foreach(var myvar in _sdb.Vars.ToList())'應該可以工作,但是取決於你在'AreaCheck(myvar)'方法中做什麼。請添加該代碼。另外,將'_sdb.SaveChanges();'移到'foreach'外部以避免多個數據庫匹配 – Developer

+0

「但是當我做到了,代碼根本無法工作」 - 沒有工作怎麼辦? – Evk

回答

4

保存後,像下面

using (var _sdb = new MyContext()) 
{ 
    foreach (var myvar in _sdb.Vars) 
    { 
     // Change myvar 
    } 
    //save at the end 
    _sdb.SaveChanges(); 
} 
+0

數據庫中有300000條記錄。這仍然有效嗎? – jason

+0

這將適用於小數據集,如果這是大數據集,那麼您最好將它們作爲塊來獲取。檢查這個asnwer http://stackoverflow.com/a/3902790/2558060 – Damith

+0

或者乾脆不要使用ORMs for那種事情。只需使用類似存儲過程的方式告訴數據庫服務器即可。 – CodeNotFound

相關問題