2010-12-30 16 views
6

Właśnie ustawiłem NHibernate po raz pierwszy. Moi platformy i config ustawienia w następujący sposób:Konfiguracja NHibernate 3.0 z ODP.NET

  • bazy danych: Oracle 11,1 g
  • ODP.NET Wersja: 4.112.1.2 (zainstalowana z ODTWithODAC112012, co stanowi 1 uwolnienie powyżej mojej instalacji Oracle db)
  • NHibernate Wersja 3.0

Stworzyłem testową aplikację MVC z projektem testowym. Następnie, aby przetestować połączenie NHibernate używam następujące oprzyrządowania:

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 plik konfiguracyjny:

<?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> 

dniu testu pojawia się następujący ślad stosu wyjątku:

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: 

Jeśli zmienię NHibernate.Driver.OracleDataClientDriver na NHibernate.Driver.OracleClientDriver (dostawca MS dla Oracle), test powiedzie się. Czy ktoś może mi powiedzieć, co robię źle?

Odpowiedz

13

Witam Myślę, że błąd się dzieje, ponieważ Nhibernate nie ładuje sterownika z GAC z Assembly.LoadWithPartialName(), ale z Assembly.Load(). Spróbuj umieścić Oracle.DataAccess.dll w katalogu bin lub użyj sekcji qualifyAssembly w pliku app.config lub web.config. Przykład:

<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> 
+0

Dzięki !!! To naprawiło to! –

+0

@SilasHansen: Jeśli to rozwiązało twój problem, powinieneś oznaczyć odpowiedź jako zaakceptowaną. –

+0

Dodano sekcję środowiska wykonawczego w pliku app.config; zmienić działanie kompilacji Oracle.DataAccess na "Kopiuj lokalnie", wciąż mam ten sam błąd na moim komputerze z systemem Windows 7 (64-bitowym). Ścieżka odniesienia dla Oracle.DataAccess to: C: \ Windows \ assembly \ GAC_32 \ Oracle.DataAccess \ 2.112.1.0__89b483f429c47342 \ Oracle.DataAccess.dll – PerlDev

1

@PerlDev: Myślę, że masz „ODP.NET 32 bitowy binarny” zainstalowany i jesteś kompilowania aplikacji z platformą „AnyCPU”. Jeśli tak, spróbuj zmienić na x86 (tak zrobiłem i działałem).

Jeśli chcesz skompilować jako x64, myślę, że musisz zainstalować "binarny 64-bitowy ODP.NET" (jeszcze tego nie zrobiłem).

0

To zadziałało dla mnie.

Go Utwórz/Menedżer konfiguracji w programie Visual Studio. Sprawdź kolumnę platformy. Zmieniono debugowanie z Dowolnego procesora na x64