2010-12-30 27 views
6

Acabo de configurar NHibernate por primera vez. Mis plataforma y configuración de los ajustes de la siguiente manera:NHibernate 3.0 configuración con ODP.NET

  • Base de datos: Oracle 11,1 g
  • ODP.NET Versión: 4.112.1.2 (instalado desde ODTWithODAC112012, que es una versión de 1 por encima de mi instalación de Oracle db)
  • NHibernate Versión 3.0

Creé una aplicación MVC de prueba con un proyecto de prueba. Entonces, para probar la conexión de NHibernate, utilizo el siguiente accesorio de la prueba:

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); 
     } 
    } 
archivo de configuración

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

En la prueba, me sale el siguiente seguimiento de pila de excepción:

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: 

Si cambio NHibernate.Driver.OracleDataClientDriver a NHibernate.Driver.OracleClientDriver (proveedor de MS para Oracle), la prueba se realiza correctamente. ¿Puede alguien decirme qué estoy haciendo mal?

Respuesta

13

Hola creo que ocurre el error, porque Nhibernate no se carga el controlador desde el GAC con Assembly.LoadWithPartialName(), pero con Assembly.Load(). Intenta colocar Oracle.DataAccess.dll en el directorio bin o usa la sección de qualifiedAssembly en tu app.config o web.config. Ejemplo:

<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

Gracias !!! ¡Eso lo solucionó! –

+0

@SilasHansen: si esto resuelve su problema, debe marcar la respuesta como aceptada. –

+0

Se agregó la sección de tiempo de ejecución en app.config; cambie la acción de compilación de Oracle.DataAccess a "Copiar local", sigue obteniendo el mismo error en mi máquina con Windows 7 (64 bit). La ruta de referencia de Oracle.DataAccess es: C: \ Windows \ assembly \ GAC_32 \ Oracle.DataAccess \ 2.112.1.0__89b483f429c47342 \ Oracle.DataAccess.dll – PerlDev

1

@PerlDev: Creo que tiene instalado un "ODP.NET 32 bit binario" y se le compilar su aplicación con la plataforma "Cualquier CPU". Si es así, intente cambiar a x86 (esto es lo que hice, y funcionó).

Si desea compilar como x64, creo que debe instalar el "binario ODP.NET de 64 bits" (aún no lo hice).

0

Esto funcionó para mí.

Vaya a Build/Configuration Manager en Visual Studio. Verifique la columna de la plataforma. Cambié la depuración de Cualquier CPU a x64

Cuestiones relacionadas