2012-01-10 78 views
2

ビジュアルスタジオ、postgresqlデータベース、およびado.netエンティティデータモデルを使用しています。接続ストリングでは、ImはMultipleActiveResultSets=Trueに設定できません。postgresqlとado.netエンティティデータモデルのMultipleActiveResultSets

通常、私はMultipleActiveResultSets=TrueでSQLサーバーに接続すると正常に動作します。しかし私はpostgresqlデータベースと同じ設定することはできません。

私はこれを使用

は、私は次のエラー、私はこの問題を解決するにはどうすればよい

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

を得ました。

+0

あなたはこの例外をスローするコードの一部を表示することができますか? – Eranga

+0

ここでエラーが発生したのは、addressData.EMPLOYEE_DATAReference.Load()です。データを読み込み中に遅延が発生しています。 – Harsha

答えて

6

複数のアクティブ結果セット(MARS)は、SQL Server 2005で導入された機能であり、postgresなどの他のデータベースシステムでは使用できないため、接続文字列で有効にすることはできません。

あなたが直面しているエラーは、開いている1台のデータリーダーで2つのクエリを実行しようとした場合の結果です。つまり、エンティティフレームワークを使用する場合、は、遅延読み込みがオンになっていて、遅延エントリが親エンティティと同じリーダーにロードされていると発生します。我々は唯一のLINQクエリを準備してきたようにデータが取得されていない1行目では

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

:たとえば、これにコード似は、このエラーを作り出すことができます。 foreachを起動すると、DataReaderが開かれ、私たちの条件を満たすユーザーの収集が照会されますが、リーダーは閉じられません。その後、foreachの内部では、遅延ロードされたUserのAddressプロパティに到達します。この遅延ロードは、同じオープン時にDataReaderのクエリ実行を引き起こし、例外が発生したときに発生します。

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

これはあなたを助けることを願っています:私はエラーを取り除くしたい場合は、私は単純に、このような行の末尾に(クエリが実行させるか何か)ToList()を追加することができます。

+1

(http://windowsazurecat.com/2011/09/understanding-sql-azure-federations-no-mars-support-and-entity-framework)[ここでは、この機能が必要な可能性のある他のいくつかの例です]。しかし、多くの非SQLサーバDBは、 "特別な" MARS機能を必要とせずに複数のオープンリーダーを持つことができ、ドライバのバグかもしれません。 –

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

すばらしい答え。それで3日間を無駄にしました。 – spark

+0

'; preload reader = true'とは何ですか? –

+0

PreloadReaderパラメータはサポートされなくなりました。 – pirimoglu

関連する問題