9

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

MARS = 多个活动结果集

实体框架文档说明了以下内容:

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

NHibernate 有同样的问题吗?

连接到 SQL Azure 时的其他信息

4

1 回答 1

4

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

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

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

于 2011-11-05T22:13:36.667 回答