nhibernate - 使用ODP.NET的NHibernate 3.0配置

标签 nhibernate

我只是第一次设置NHibernate。我的平台和配置设置如下:

  • 数据库:Oracle 11.1g
  • ODP.NET版本:4.112.1.2(从ODTWithODAC112012安装,该版本比我的Oracle db安装高1个版本)
  • NHibernate 3.0版

  • 我用一个测试项目创建了一个测试MVC应用程序。然后,为了测试NHibernate连接,我使用以下测试夹具:
    using IBCService.Models;
    using NHibernate.Cfg;
    using NHibernate.Tool.hbm2ddl;
    using NUnit.Framework;
    namespace IBCService.Tests
    {
        [TestFixture]
        public class GenerateSchema_Fixture
        {
            [Test]
            public void Can_generate_schema()
            {
                var cfg = new Configuration();
                cfg.Configure();
                cfg.AddAssembly(typeof(Product).Assembly);
                new SchemaExport(cfg).Execute(false, true, false);
            }
        }
    

    Nhibernate配置文件:
    <?xml version="1.0" encoding="utf-8"?>
    <!-- This config use Oracle Data Provider (ODP.NET) -->
    <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
      <session-factory name="NHibernate.Test">
        <property name="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</property>
        <property name="connection.connection_string">
          User ID=TEST;Password=******;Data Source=//RAND
        </property>
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="show_sql">false</property>
        <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
        <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
        <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
      </session-factory>
    </hibernate-configuration>
    

    在测试中,我得到以下异常堆栈跟踪:
    NHibernate.HibernateException was unhandled by user code
      Message=Could not create the driver from NHibernate.Driver.OracleDataClientDriver.
      Source=NHibernate
      StackTrace:
           at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary`2 settings) in d:\CSharp\NH\nhibernate\src\NHibernate\Connection\ConnectionProvider.cs:line 113
           at NHibernate.Connection.ConnectionProvider.Configure(IDictionary`2 settings) in d:\CSharp\NH\nhibernate\src\NHibernate\Connection\ConnectionProvider.cs:line 64
           at NHibernate.Connection.ConnectionProviderFactory.NewConnectionProvider(IDictionary`2 settings) in d:\CSharp\NH\nhibernate\src\NHibernate\Connection\ConnectionProviderFactory.cs:line 50
           at NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Action`1 scriptAction, Boolean export, Boolean justDrop) in d:\CSharp\NH\nhibernate\src\NHibernate\Tool\hbm2ddl\SchemaExport.cs:line 333
           at NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Boolean script, Boolean export, Boolean justDrop) in d:\CSharp\NH\nhibernate\src\NHibernate\Tool\hbm2ddl\SchemaExport.cs:line 290
           at IBCService.Tests.GenerateSchema_Fixture.Can_generate_schema() in D:\APPS\VS2010\IBanking\CustomerService\IBCService.Tests\GenerateSchema_Fixture.cs:line 21
      InnerException: System.Reflection.TargetInvocationException
           Message=Exception has been thrown by the target of an invocation.
           Source=mscorlib
           StackTrace:
                at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
                at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
                at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
                at System.Activator.CreateInstance(Type type, Boolean nonPublic)
                at System.Activator.CreateInstance(Type type)
                at NHibernate.Bytecode.ActivatorObjectsFactory.CreateInstance(Type type) in d:\CSharp\NH\nhibernate\src\NHibernate\Bytecode\ActivatorObjectsFactory.cs:line 9
                at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary`2 settings) in d:\CSharp\NH\nhibernate\src\NHibernate\Connection\ConnectionProvider.cs:line 107
           InnerException: System.NullReferenceException
                Message=Object reference not set to an instance of an object.
                Source=NHibernate
                StackTrace:
                     at NHibernate.Driver.OracleDataClientDriver..ctor() in d:\CSharp\NH\nhibernate\src\NHibernate\Driver\OracleDataClientDriver.cs:line 42
                InnerException: 
    

    如果将NHibernate.Driver.OracleDataClientDriver更改为NHibernate.Driver.OracleClientDriver(Oracle的MS提供程序),则测试成功。有人可以告诉我我在做什么错吗?

    最佳答案

    你好
    我认为会发生错误,因为Nhibernate并未使用Assembly.LoadWithPartialName()从GAC加载驱动程序,而是使用Assembly.Load()从GAC加载了驱动程序。尝试将Oracle.DataAccess.dll放在bin目录中,或使用qualifyAssembly部分放入您的app.config或web.config中。
    例子:

    <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <qualifyAssembly partialName="Oracle.DataAccess"
    fullName="Oracle.DataAccess, Version=2.102.2.20, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </assemblyBinding>
    </runtime>
    

    关于nhibernate - 使用ODP.NET的NHibernate 3.0配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4562002/

    相关文章:

    c# - 在 Fluent NHibernate 中创建数据库期间列名发生变化

    c# - Eval(),只能在数据绑定(bind)控件错误的上下文中使用。为什么会这样?我该怎么办?

    nhibernate - 异常 "instance was not in a valid state"

    c# - 为什么 ASP.NET Identity 的 `UserStore` 中有这么多存储库?

    c# - Rhino mocks throws exception of "Callback arguments didn' t match the method arguments delegate"on the do 方法

    c# - 使用 Fluent NHibernate 映射大字符串

    c# - NHibernate 异常枚举器已修改

    nhibernate - 如何关闭 NHibernate 的自动(脏检查)更新行为?

    nhibernate - Fluent Nhibernate 复合键映射

    c# - 帮助使 Fluent NHibernate 为每个表创建一个 oracle 序列