今天在項目過程中遇到一個問題
項目
使用了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();