9

Entity Framework と NHibernate を比較しています。SQL Server を使用している場合、MARS サポートを有効または無効にすると NHibernate にどのような影響があるかを知りたいです。

MARS = 複数のアクティブな結果セット

エンティティ フレームワークのドキュメントには、次のように記載されています。

(C#) または(Visual Basic) の列挙Load中にメソッドを呼び出すと 、Entity Framework は新しいデータ リーダーを開こうとします。接続文字列で指定して複数のアクティブな結果セットを有効にしない限り、この操作は失敗します。詳細については、MSDNの「複数のアクティブな結果セット (MARS) の使用」を参照してください。クエリの結果を List コレクションに読み込むこともできます。これにより、データ リーダーが閉じ、コレクションを列挙して参照エンティティを読み込むことができます。foreachFor Eachmultipleactiveresultsets=true

NHibernate にも同じ問題がありますか?

SQL Azure への接続時の追加情報

4

1 に答える 1

4

あなたが言及している問題は「サーバー側カーソル」にリンクされています.nHibernateについて私が知る限り、これは問題にならないはずです.単にそれらを使用しないからです.
LINQ を使用して nHibernate にオブジェクトをロードしている場合、foreach 列挙型への最初のアクセス時に、nHibernate はクエリの結果セット全体をメモリにロードします。このようにして、セッションの接続を使用して他のすべてをロードできます。HQL クエリまたは Criteria を使用する場合、"List()" を呼び出すと結果セットが読み込まれ、接続が閉じられます。

反対側のエンティティ フレームワークでは、foreach 列挙を介してコレクションをスクロールするときにスマートにサーバー側カーソルを使用するようにしてください。そのため、foreach 列挙が終了するまで、objectContext の接続はサーバー側カーソルで「ビジー」になります。MARS が有効になっていない場合、EF は接続を使用して別の結果セットを読み込むことができず (update、insert、delete などの他のステートメントを引き続き発行できます)、「There is already an open DataReader associated with this 」のようなエラーが表示されます。最初に閉じる必要があるコマンド」または同様のもの。

これが役に立てば幸いです、
Marco
編集:
調査の結果、nHibernate で MARS を使用できることがわかりましたが、バージョン 3.2.0.4000 では、それをサポートする SqlServer 用のドライバーはまだありません。もちろん、SqlClientDriver ではサポートされていません (MARS をサポートしていない Sql2000 を対象としているため) が、Sql2008ClientDriver でも関連するプロパティが false に設定されています。とにかく、これはできるだけ早くnHibernateチームに投稿するものです

于 2011-11-05T22:13:36.667 に答える