2010-04-02 28 views
2

我在一個項目中使用LINQ to Entity,在這裏我從數據庫中拉出一堆數據並將其組織成一堆對象並將其保存到數據庫中。在使用LINQ to Entity之前,我沒有遇到寫入db的問題,但我遇到了這個問題。這是我得到的錯誤(這是「的InnerException」,除了本身是沒用!):LINQ的問題(到實體)[添加記錄]

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

我已經看到,之前,當我試圖保存我的更改內循環。在這種情況下,循環結束,並試圖進行該調用,只是爲了給我例外。下面是當前的代碼:

try 
{ 
    //finalResult is a list of the keys to match on for the records being pulled 
    foreach (int i in finalResult) 
    { 
     var queryEff = (from eff in dbMRI.MemberEligibility 
         where eff.Member_Key == i && eff.EffDate >= DateTime.Now 
         select eff.EffDate).Min(); 

     if (queryEff != null) 
     { 
      //Add a record to the Process table 
      Process prRecord = new Process(); 
      prRecord.GroupData = qa; 
      prRecord.Member_Key = i; 
      prRecord.ProcessDate = DateTime.Now; 
      prRecord.RecordType = "F"; 
      prRecord.UsernameMarkedBy = "Autocard"; 
      prRecord.GroupsId = qa.GroupsID; 
      prRecord.Quantity = 2; 
      prRecord.EffectiveDate = queryEff; 

      dbMRI.AddObject("Process", prRecord); 
     } 
    } 

    dbMRI.SaveChanges(); //<-- Crashes here 

    foreach (int i in finalResult) 
    { 
     var queryProc = from pro in dbMRI.Process 
         where pro.Member_Key == i && pro.UsernameMarkedBy == "Autocard" 
         select pro; 

     foreach (var qp in queryProc) 
     { 
      Audit aud = new Audit(); 
      aud.Member_Key = i; 
      aud.ProcessId = qp.ProcessId; 
      aud.MarkDate = DateTime.Now; 
      aud.MarkedByUsername = "Autocard"; 
      aud.GroupData = qa; 

      dbMRI.AddObject("Audit", aud); 
     } 
    } 

    dbMRI.SaveChanges();   //<-- AND here (if the first one is commented out) 
} 
catch (Exception e) 
{ 
    //Do Something here 
} 

基本上,我需要它插入一條記錄,獲取該插入的記錄的標識和記錄插入另一個表從第一條記錄的身份。鑑於其他一些限制,兩者之間不可能創建FK關係(我嘗試過,但應用程序的某些其他部分不允許這樣做,而且我的DBA團隊無論出於何種原因都不喜歡FK,但這是爲了不同的話題:))

任何想法可能會導致這種情況?

謝謝!

編輯:感謝您更新標籤!

+1

1)你的應用是多線程的嗎? 2)dbRMI的範圍是什麼?它夠新鮮嗎? – Henri 2010-04-02 19:09:17

+0

1)我沒有做多線程,所以我會說它不是。 2)dbMRI具有控制器的全局範圍。 3)我不確定你的意思是新鮮的... – SlackerCoder 2010-04-02 20:51:02

回答

10

你的問題是你有一個開放的閱讀器的地方。解決方案是確保您選擇了您的數據,並且在調用SaveChanges()時不會枚舉查詢。

我的猜測是finalResult是可查詢的(所以添加一個ToList(),ToArray()等),或者你發給我們的塊是在一個正在枚舉的linq查詢的較大的塊內。

+2

這是做到了。我不敢相信我沒有看到「父母」foreach循環。顯然,使父查詢.ToList()和遍歷列表而不是查詢本身幫助:) 謝謝。我需要朝着正確的方向發現這一個! – SlackerCoder 2010-04-05 13:18:11

+0

感謝您的回答尼克斯。確切地解決了我的問題。我有一個foreach循環,並錯誤地假設(從來不明智!),foreach會依次查詢我的查詢的.ToList'd版本。 – 2011-05-25 12:02:27