2016-03-03 116 views
3

我正在使用EF7(EF核心)。 當我試圖更新數據庫的項目,如這一個方法...實體框架7(核心):DataReader必須關閉異常

using (var db = new DBContext()) 
{ 
    var deadSources = 
     await 
      db.Source.Where(x => !x.Item.Any()) 
       .ToListAsync(); 
    foreach (var srs in deadSources) 
    { 
     srs.InspectionFailed = true; 
     srs.InspectionFailedDescription = "ERROR"; 
    } 
    await db.SaveChangesAsync(); 
} 

using (var db = new DBContext()) 
{ 
    var aliveSources = 
     await 
      db.Source.Where(x => x.Item.Any()) 
       .ToListAsync(); 
    foreach (var srs in aliveSources) 
    { 
     srs.InspectionFailed = false; 
     srs.InspectionFailedDescription = string.Empty; 
    } 
    await db.SaveChangesAsync(); // Exception here 
} 

...這將引發異常:

已經有與此命令相關的開放其中的DataReader必須先關閉 。

我該如何避免這種情況?每個數據庫請求有兩種不同的上下文,所以我不明白爲什麼會發生這種情況。

+0

此代碼是單個使用語句,引發異常。這就是爲什麼我分開它。但沒有運氣。 – AsValeO

回答

6

它不一樣,如果你有相同的DbContext的一個,兩個或更多的情況下,每個連接一個DataReader的的限制存在於數據庫服務端,所以您需要啓用MultipleActiveResultSets選項在連接字符串中的事項:

<add name="XYZ" connectionString="Server=SERVER;Database=DATABASE; 
Trusted_Connection=SSPI;MultipleActiveResultSets=True;" 
providerName="System.Data.SqlClient"/> 
+0

你確定嗎?我一直認爲這是一個_connection_。看起來efcore並未關閉閱讀器或釋放與池的連接。 –

+0

@JorgeAlves,即使您直接使用ADO.NET,您也會得到相同的行爲,如果您希望爲同一連接使用多個數據讀取器,則需要啓用MultipleActiveResultSets。 –

+0

對於需要MARS的示例,請檢查[此鏈接](https://msdn.microsoft.com/en-us/library/yf1a7f4f(v = vs.110).aspx)。查看可重入的DataReaders?這基本上是MARS允許你做的。 如果efcore在SaveChangesAsync中這樣做,你可以打賭有一個地方的錯誤。 –

1

請考慮這可能是您使用的版本中的錯誤。

如果沒有積極MultipleActiveResultSets你只能有每個連接一個DataReader的無處在代碼中,我可以看到正在使用不止一個。很可能efcore沒有在ToListAsync()中正確關閉它,並且啓用MARS只是掩蓋了這個問題。

RTM自您的問題發佈以來已經發布,您的特定問題可能已經很好地解決了。

相關問題