2011-05-26 40 views
15

Aquí está el código de lanzar la excepción:No se pudo crear el controlador desde NHibernate.Driver.OracleDataClientDriver

public static class NHibernateSessionManager 
{ 
    private static ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory(); 

    public static ISession GetSession(string clientId) 
    { 
     if (ContextSession == null) 
      ContextSession = sessionFactory.OpenSession(new OracleIntercerptor(clientId.ToUpper())); 
     else 
      ((OracleConnection)ContextSession.Connection).ClientId = clientId; 

     return ContextSession; 
    } 

    // - snip - 
} 

y la llamada al código en el que se produce la excepción:

private ISession NHibernateSession 
    { 
     get 
     { 
      return NHibernateSessionManager.GetSession(SessionWrapper.GetUser()); 
     } 
    } 

consigo una TypeInitializationException

{ "El tipo inicializador para 'Sigaf.Presupuesto.EntidadesDAL.NHibernate.NHiberna teSessionManager' inició una excepción. "}

Con una excepción interna de

{" No se pudo crear el controlador desde NHibernate.Driver.OracleDataClientDriver. "}

Un algunas excepciones más internas me llevan a un NRE:

Referencia de objeto no s et a una instancia de un objeto.
en NHibernate.Driver.OracleDataClientDriver..ctor()

v4.0 v3.0 NHibernate marco de destino aplicación Este código está trabajando para otros, similares, soluciones.

Oh, el archivo Hibernate.config:

<?xml version="1.0"?> 
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
    <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property> 
    <property name="current_session_context_class">web</property> 
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property> 
    <property name="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</property> 
    <property name="connection.connection_string_name">Sigaf</property> 
    <property name="default_schema">PRE</property> 
    <property name="show_sql">true</property> 
    <mapping assembly="Sigaf.Presupuesto.EntidadesDAL" /> 
    </session-factory> 
</hibernate-configuration> 

Respuesta

35

Asegúrese de que el controlador de Oracle real está en la carpeta bin de la aplicación.

En Visual Studio debe agregar una referencia a Oracle.DataAcess.dll en su proyecto, por ejemplo.

Seleccione la DLL => Haga clic con el botón derecho en it => En la cuadrícula Propiedades, seleccione Copiar local = Verdadero.

Esto debería resolver su problema.

+4

Lo hice en mi proyecto de acceso a datos, pero no funcionó. Una vez que hice esto en mi proyecto de aplicación (MVC3) funcionó. – Alex

+3

Eso tiene sentido, un proyecto solo traerá ensambles que requiere una referencia para compilar. Para este tipo de referencias, que son referencias de reflexión/solo configuración, deben estar en el proyecto de host. – Rich

Cuestiones relacionadas