1

私たちのシステムでは、nhibernate と Oracle を使用しています。Oracle.DataAccess.dll と、クライアントのサーバーにインストールされている Oracle クライアントとの関係が混乱しているため、常に多くの展開の問題が発生します。

インストールされているOracleクライアントを変更できる場合とできない場合があります。32 ビット版の dll が必要な場合もあれば、64 ビット版が必要な場合もあります。より使いやすいデータベースに oracle を変更できればと思いますが、今のところそれはオプションではありません。

この混乱をすべて取り除く 1 つの方法は、DbProviderFactories を使用することです。そのため、プロジェクトで Oracle.DataAccess.dll を参照せず、サーバーにインストールされているバージョンを使用できます。

DbProviderFactory を使用するように nhibernate を構成するにはどうすればよいですか?

私の構成:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="dialect">NHibernate.Dialect.Oracle9iDialect</property>
      <property name="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</property>
      <property name="connection.connection_string">Data Source=XE; User Id=*****; Password=******;</property>
      <property name="current_session_context_class">NHibernate.Context.ManagedWebSessionContext, NHibernate</property>
      <property name="sql_exception_converter">Way2Pim.Data.NHibernate.SqlExceptions.SqlExceptionConverter, Way2Pim.Data</property>
      <property name="show_sql">true</property>
      <property name="hbm2ddl.keywords">none</property>
      <mapping assembly="MyAssembly" />
    </session-factory>
  </hibernate-configuration>
4

2 に答える 2

0

リフレクションごとのロードが失敗した場合、NHibernateはすでにdbproviderfactoryを使用しています。見るNHibernate.Driver.ReflectionBasedDriver

この機能は、

Revision: bb904343e18b693f6d1e13b357c305fdd46ff5ee
Author: Fabio Maulo
Date: 14.08.2010 19:37:12
Message:
Refactoring of ReflectionBasedDriver in order to use DbProviderFactories
于 2012-05-08T07:29:57.050 に答える
0

とった!

Nhibernateには、OracleとDBProviderFactoriesに関するバグがあります。OracleDataClientDriverクラスを見ると、ReflectionBasedDriverから派生しています。

そのコンストラクターで、ReflectionBasedDriverはDbProviderFactoryからOracle.DataAccessプロバイダーを正しくロードします。その後、OracleDataClientDriverコンストラクタは、ロードされたアセンブリからOracleCommandタイプを取得しようとしますが、これはもちろんnullになります(Oracle.DataAccessはまだメモリにありません)。

簡単な修正は、OracleDataClientDriverからすべてをコピーする独自のドライバーを作成することですが、そのコンストラクターのすべての行を次のように置き換えます。

System.Type oracleCommandType = base.CreateCommand().GetType();
oracleCommandBindByName = oracleCommandType.GetProperty("BindByName");

System.Type parameterType = oracleCommandType.Assembly.GetType("Oracle.DataAccess.Client.OracleParameter");
oracleDbType = parameterType.GetProperty("OracleDbType");

System.Type oracleDbTypeEnum = oracleCommandType.Assembly.GetType("Oracle.DataAccess.Client.OracleDbType");
oracleDbTypeRefCursor = System.Enum.Parse(oracleDbTypeEnum, "RefCursor");

これで、プロジェクトにOracle.DataAccess.dllはもうありません:)

于 2012-05-08T20:49:14.130 に答える