2012-01-10 194 views
2

即時通訊使用Visual Studio,PostgreSQL數據庫和ado.net實體數據模型。在連接字符串中,我無法設置MultipleActiveResultSets=TrueMultipleActiveResultSets爲PostgreSQL和ado.net實體數據模型

通常當我連接到SQL服務器與MultipleActiveResultSets=True,它工作正常。但我不能設置與postgresql數據庫相同。

當我用這個,我有以下錯誤

There is already an open DataReader associated with this Command which must be closed first.

我該如何解決這個問題。

+0

可以顯示引發此異常的代碼片段嗎? – Eranga 2012-01-10 13:29:37

+0

即時得到錯誤這裏addressData.EMPLOYEE_DATAReference.Load(),我的意思是雖然延遲加載的數據。 – Harsha 2012-01-11 04:12:07

回答

6

多個活動結果集(MARS)是SQL Server 2005中引入的功能,在其他數據庫系統(如postgres)中不可用,因此您無法在連接字符串中將其打開。

您正面臨的錯誤是嘗試在一個打開的數據讀取器上執行兩個查詢的結果。當使用ie實體框架時,通常會在您有時發生延遲加載開啓,並且懶惰屬性與父指令載入相同的閱讀器。例如,一個代碼類同這可能會產生這樣的錯誤:

var users = context.Users.Where(u => u.FirstName.StartsWith("Ha")); 
foreach (var user in users) 
{ 
    Console.WriteLine(user.Address.StreetName); 
} 

第1行,因爲我們只准備了LINQ查詢沒有數據被取出。當我們開始foreach一個DataReader被打開,用戶的集合,符合我們的條件進行查詢,但讀者不會被關閉。然後裏面foreach我們到達用戶的地址屬性,它是延遲加載。此延遲加載會導致在同一個打開的DataReader上執行查詢,這是發生異常的原因。如果我想擺脫錯誤的,我可以一個ToList()(或任何導致查詢來執行)只需添加到像這樣的行的末尾:

var users = context.Users.Where(u => u.FirstName.StartsWith("Ha")).ToList();

希望這會幫助你。

+1

[以下是你可能需要此功能的一些其他情況下(http://windowsazurecat.com/2011/09/understanding-sql-azure-federations-no-mars-support-and-entity-framework)。話雖如此,許多非-SQL服務器數據塊可以愉快地有多個打開的讀者無需任何「特殊」 MARS的功能,所以它可能只是一個驅動程序的bug。 – 2012-01-11 15:10:41

3

只需在您的postgresql連接字符串中添加preload reader = true即可。

<connectionStrings> 

    <add name="PostgresQL Npgsql" connectionString="server=srvubuntu01;user id=postgres;password=postgres;database=WinUnified;preload reader=true" providerName="Npgsql" /> 

    </connectionStrings> 
+0

美好的回答。我浪費了三天的時間。 – spark 2016-01-27 06:42:18

+0

'; preload reader = true'是什麼? – 2017-01-27 20:06:25

+0

不再支持PreloadReader參數 – pirimoglu 2017-07-21 19:39:23

相關問題