MARS对NHibernate有什么影响?

时间:2011-10-05 15:40:01

标签: sql-server nhibernate mars

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

MARS =多个活动结果集

Entity Framwork documentation声明如下:

  

Load (C#)或 foreach 期间调用 For Each 方法时   (Visual Basic)枚举,实体框架尝试打开一个新的   数据阅读器。除非您启用了多个操作,否则此操作将失败   通过在。中指定 multipleactiveresultsets=true 来设置有效结果集   连接字符串。有关详细信息,请参阅MSDN上的Using Multiple Active Result Sets (MARS)。您还可以加载查询结果   进入List集合,关闭数据阅读器并启用您   枚举集合以加载引用的实体。

NHibernate有同样的问题吗?

Additional information when connecting to SQL Azure

1 个答案:

答案 0 :(得分:4)

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

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

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