我正在将实体框架与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有同样的问题吗?
答案 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团队的东西