不允許啟動新事務,因為有其他線程正在該會話中運行。


今天在項目過程中遇到一個問題

項目

使用了EF4.0,在執行 SaveChanges() 時,出現異常 “不允許啟動新事務,因為有其他線程正在該會話中運行。”

 

代碼如下

IQueryable<UserRights> userRights = unitWork.UserRightsRepository.Get().Where(obj => obj.nUserID == userGroupMapp.nUserID);

foreach (UserRights userRight in userRights)
{
GroupRight gr = groupRights.Find(obj => obj.nMenuID == userRight.nMenuID);
if (gr == null)
{
  unitWork.UserRightsRepository.Delete(userRight);
  unitWork.Save();
}

找了很久原因,最后才發現,unitWork.Save();應該放到循環外面來,因為Linq的延時執行,在循環的時候,查詢語句還在執行,這個時候調用SaveChanges方法就會出現異常,解決辦法就是將它移動到循環外面

正確的代碼如下

IQueryable<UserRights> userRights = unitWork.UserRightsRepository.Get().Where(obj => obj.nUserID == userGroupMapp.nUserID);

foreach (UserRights userRight in userRights)
{
GroupRight gr = groupRights.Find(obj => obj.nMenuID == userRight.nMenuID);
if (gr == null)
{
  unitWork.UserRightsRepository.Delete(userRight);  
}

unitWork.Save();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM