Конфигурация NHibernate 3.0 с ODP.NET - PullRequest
6 голосов
/ 30 декабря 2010

Я просто настроил NHibernate в первый раз. Мои настройки платформы и конфигурации следующие:

  • База данных: Oracle 11.1g
  • ODP.NET Версия: 4.112.1.2 (устанавливается из ODTWithODAC112012, что на 1 версию выше моей установки Oracle db)
  • 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 (поставщик MS для Oracle), тест пройден успешно. Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 3 ]

13 голосов
/ 05 февраля 2011

Привет Я думаю, что ошибка происходит, потому что Nhibernate не загружает драйвер из GAC с Assembly.LoadWithPartialName (), но с Assembly.Load (). Попробуйте поместить 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>
1 голос
/ 08 апреля 2013

@ PerlDev: Я думаю, что у вас установлен "32-битный двоичный файл ODP.NET" и вы компилируете свое приложение с платформой "AnyCPU". Если это так, попробуйте перейти на x86 (это то, что я сделал, и работал).

Если вы хотите скомпилировать как x64, я думаю, вы должны установить «64-битный двоичный файл ODP.NET» (я еще этого не делал).

0 голосов
/ 19 декабря 2013

Это сработало для меня.

Go Build / Configuration Manager в Visual Studio.Проверьте колонку платформы.Я изменил отладку с любого процессора на x64

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...