2

我们正在使用 NHibernate 版本 4.0.4.4000 并使用 FluentNHibernate 版本 2.0.3.0 对其进行配置。

我正在尝试使用 Oracle 数据客户端批处理批处理器工厂 (OracleDataClientBatchingBatcherFactory) 在 Oracle 连接上设置批处理,并使用以下代码创建 NHConfiguration:

var cfg = new NHibernate.Cfg.Configuration().DataBaseIntegration(prop => {
        prop.BatchSize = 1000;
        prop.Batcher<OracleDataClientBatchingBatcherFactory>();
    });

在会话刷新时获得以下异常:

System.NullReferenceException: Object reference not set to an instance of an object.
   at NHibernate.AdoNet.OracleDataClientBatchingBatcher.SetArrayBindCount(Int32 arraySize)
   at NHibernate.AdoNet.OracleDataClientBatchingBatcher.DoExecuteBatch(IDbCommand ps) ...

看起来 SetArrayBindCount 方法正在使用反射在 OracleCommand 中设置 ArrayBindCount 属性。此方法引发空引用异常。

有没有其他人遇到过同样的问题?我是否遗漏了什么或者它是 OracleDataClientBatchingBatcher 中的错误?

当我使用 SQL Client Batching Batcher Factory (SqlClientBatchingBatcherFactory) 时没有遇到这个问题

var cfg = new NHibernate.Cfg.Configuration().DataBaseIntegration(prop => {
        prop.BatchSize = 1000;
        prop.Batcher<SqlClientBatchingBatcherFactory>();
    });

任何帮助将不胜感激,因为这目前正在阻止我们。

问题来源:https ://groups.google.com/forum/#%21topic/nhusers/-rzStjZSxmI

4

1 回答 1

3

花了一个小时我发现问题的根本原因是OracleDataClientBatchingBatcher与 nHibernate 支持的所有 Oracle 连接驱动程序不兼容。就我而言,它是 NHibernate.Driver.OracleClientDriver实际上是 and 的包装System.Data.OracleClient.ConnectionSystem.Data.OracleClient.OracleCommand

public OracleClientDriver() :
        base(
        "System.Data.OracleClient",
        "System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 
        "System.Data.OracleClient.OracleConnection", 
        "System.Data.OracleClient.OracleCommand") { }

如果您检查 OracleCommand 类,您会发现它实际上并不包含属性“ArrayBindCount”。除了这个 MSDN 告诉 System.Data.OracleClient 命名空间中的类已被弃用:

System.Data.OracleClient 中的这种类型已被弃用,并将在 .NET Framework 的未来版本中删除。有关详细信息,请参阅 Oracle 和 ADO.NET。

要解决此问题,您必须选择NHibernate.Driver.OracleManagedDataClientDriver作为使用 Oracle ADO.NET 的连接驱动程序。这是执行此操作的 nHibernate 配置文件的一部分:

<property name="connection.provider">
    NHibernate.Connection.DriverConnectionProvider
</property>
<property name="connection.driver_class">
    NHibernate.Driver.OracleManagedDataClientDriver
</property>
<property name="dialect">
    NHibernate.Dialect.Oracle10gDialect
</property> 

此外,您需要从 NuGet 安装 Oracle.ManagedDataAccess 包

PM> 安装包 Oracle.ManagedDataAccess

这种方法对我来说非常有效

于 2016-01-18T18:50:20.037 回答