MARS对NHibernate有什么影响?

Mat*_*int 9 sql-server nhibernate sql-server-mars

我正在将实体框架与NHibernate进行比较,我想知道在使用SQL Server时,在NHibernate上启用或禁用MARS支持会产生什么影响(如果有的话)?

MARS =多个活动结果集

实体Framwork文件规定如下:

Loadforeach(C#)或For Each (Visual Basic)枚举期间调用方法时,实体框架会尝试打开新的数据读取器.除非通过multipleactiveresultsets=true在连接字符串中指定启用了多个活动结果集,否则此操作将失败.有关详细信息,请参阅在MSDN上使用多个活动结果集(MARS).您还可以将查询结果加载到List集合中,该集合关闭数据读取器并使您能够枚举集合以加载引用的实体.

NHibernate有同样的问题吗?

连接到SQL Azure时的其他信息

mCa*_*nto 4

您提到的问题与“服务器端游标”相关,据我所知,nHibernate这不应该是一个问题,只是因为它不使用它们。
如果您使用 LINQ 在 nHibernate 中加载对象,则在第一次访问 foreach 枚举时,nHibernate 会在内存中加载查询的整个结果集,这样它就可以使用会话的连接来加载其他所有内容。当使用 HQL 查询或 Criteria 时,它将在您调用“List()”时加载结果集,然后关闭连接。

另一方面,实体框架在通过 foreach 枚举滚动集合时,尝试变得聪明并利用服务器端游标,因此 objectContext 的连接与服务器端游标“忙”,直到 foreach 枚举结束。如果未启用 MARS,EF 无法使用该连接加载另一个结果集(您仍然可以发出其他语句,例如更新、插入和删除),因此它会给您一个错误,例如“已经有一个与此关联的打开的 DataReader”必须先关闭的命令”或类似的内容。

希望这有帮助,
Marco
编辑:
经过一些研究,我发现 nHibernate 可以使用 MARS,但仍然在版本 3.2.0.4000 中没有支持它的 SqlServer 驱动程序。当然,在 SqlClientDriver 中不支持(因为 Sql2000 不支持 MARS),但即使在 Sql2008ClientDriver 中,相关属性也设置为 false。无论如何,我会尽快将其发布给 nHibernate 团队