首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用nhibernate和oracle使用DbProviderFactories

使用nhibernate和oracle使用DbProviderFactories
EN

Stack Overflow用户
提问于 2012-05-07 21:03:24
回答 2查看 676关注 0票数 1

在我们的系统中,我们使用nhibernate和Oracle。我们总是有很多部署问题,因为安装在我们客户端服务器上的Oracle.DataAccess.dll与Oracle之间的关系是一团糟。

有时我们可以更改安装的oracle客户端,有时不能。有时我们需要32位版本的dll,有时需要64位版本。我希望我可以改变oracle,以建立一个更友好的数据库,但这暂时不是一个选择。

解决所有这些混乱的方法之一是使用DbProviderFactories,这样我就不能在我的项目中引用Oracle.DataAccess.dll,并且使用服务器上安装的任何版本。

如何配置nhibernate以使用DbProviderFactory?

我的配置:

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

发布于 2012-05-08 07:29:57

如果每个反射加载失败,NHibernate已经使用dbproviderfactory。请参阅NHibernate.Driver.ReflectionBasedDriver

此功能可以使用,因为

代码语言:javascript
复制
Revision: bb904343e18b693f6d1e13b357c305fdd46ff5ee
Author: Fabio Maulo
Date: 14.08.2010 19:37:12
Message:
Refactoring of ReflectionBasedDriver in order to use DbProviderFactories
票数 0
EN

Stack Overflow用户

发布于 2012-05-08 20:49:14

明白了!

Nhibernate有一个关于甲骨文和DBProviderFactories的错误。如果您查看OracleDataClientDriver类,它是从ReflectionBasedDriver派生的。

在它的构造函数中,ReflectionBasedDriver正确地从DbProviderFactory加载Oracle.DataAccess提供程序。之后,OracleDataClientDriver构造函数尝试从加载的程序集中获取OracleCommand类型,这当然会导致null ( Oracle.DataAccess还没有在内存中)。

一个快速的解决方法是创建您自己的驱动程序,从OracleDataClientDriver复制所有内容,但是用以下方法替换其构造函数的所有行:

代码语言:javascript
复制
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了:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10489106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档