2009-06-24 9 views
8

Estoy utilizando el último NHibernate 2.1.0Beta2. Estoy tratando de probar la unidad con SQLite y he puesto la configuración como:Cómo configurar SQLite para ejecutar con NHibernate donde el ensamblado resuelve System.Data.SQLite?

 Dictionary<string, string> properties = new Dictionary<string, string>(); 
     properties.Add("connection.driver_class", "NHibernate.Driver.SQLite20Driver"); 
     properties.Add("dialect", "NHibernate.Dialect.SQLiteDialect"); 
     properties.Add("connection.provider", "NHibernate.Connection.DriverConnectionProvider"); 
     properties.Add("query.substitutions", "true=1;false=0"); 
     properties.Add("connection.connection_string", "Data Source=test.db;Version=3;New=True;"); 
     properties.Add("proxyfactory.factory_class", 
         "NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu"); 

     configuration = new Configuration(); 
     configuration.SetProperties(properties); 

cuando trato de correr, me sale el siguiente error:

NHibernate.HibernateException: The IDbCommand and IDbConnection implementation in the assembly System.Data.SQLite could not be found. Ensure that the assembly System.Data.SQLite is located in the application directory or in the Global Assembly Cache. If the assembly is in the GAC, use <qualifyAssembly/> element in the application configuration file to specify the full name of the assembly. 
at NHibernate.Driver.ReflectionBasedDriver..ctor(String driverAssemblyName, String connectionTypeName, String commandTypeName) in c:\CSharp\NH\nhibernate\src\NHibernate\Driver\ReflectionBasedDriver.cs: line 26 
at NHibernate.Driver.SQLite20Driver..ctor() in c:\CSharp\NH\nhibernate\src\NHibernate\Driver\SQLite20Driver.cs: line 28 

por lo que parece que necesito para referenciar el montaje directamente. ¿Cómo haría esto para no tener más este error?

He descargado el último ensamblaje desde aquí: http://sourceforge.net/projects/sqlite-dotnet2.

+0

En caso de que alguien se topa con esta pregunta y está buscando una versión actualizada de esta respuesta -
El puesto en mi blog sobre esta pregunta exacta es mucho más actualizada que las respuestas aquí ...
[http: // debuggerstepthrough.blogspot.co.il/2011/08/unit-testing-fluentnhibernate.html](http://debuggerstepthrough.blogspot.co.il/2011/08/unit-testing-fluentnhibernate.html) – gillyb

+0

Es el código de sqlite-dotnet2 en el directorio de la aplicación? (¿o registrado en el GAC?) – Jay

+0

Tengo una referencia a System.Data.SQLite.DLL en mis referencias del proyecto. Supongo que cuando ejecuto la prueba unitaria (a través del corrector de prueba de la unidad Resharper), la copia. –

Respuesta

12

¿Está ejecutando Windows de 64 bits?

Al buscar en Google, vi varias publicaciones comentando que el archivo SQLite dll está diseñado para x86, no x64.

ver este mensaje: http://codetripper.wordpress.com/2009/01/03/using-sqlite-on-vista-64-bit/

Editar: No estoy seguro de que cuando, pero me di cuenta hoy que las últimas versiones de System.Data.SQLite incluyen la DLL de 64 bits. El x64 .dll está en \bin\x64.

http://sqlite.phxsoftware.com/

+0

Eso lo hizo. Gracias por la ayuda. –

+7

siempre puede establecer el proyecto Unit Test para compilar x86 (en las propiedades del proyecto, pestaña de compilación). Tengo que hacer esto si los proyectos se comparten entre desarrolladores que no usan ventanas de 64 bits. – nachojammers

6

Después de añadir la referencia al ensamblado System.Data.SQLite, tuve que establecer copia local true (seleccione la referencia de ensamblado en VS y vaya a propiedades) para que el montaje se copia en el directorio bin

3

Si no desea utilizar la versión de 64 bits de System.Data.Sqlite Puede cambiar el "objetivo de la plataforma" (en el proyecto visual studio-> properties-> Build) a x86.

+0

Esto funcionó para mí también. –

3

Tuve el mismo problema, y ​​las soluciones anteriores no funcionó para mí. Creo que System.Data.SQLite ha cambiado desde entonces.

Tenga en cuenta que este problema es específico para un caso respetando todas de los siguientes criterios:

  • usando SQLite
  • con System.Data.SqlLite
  • en una máquina x64
  • y NHibernate (2.1.2.4 en mi caso)

Ese pedazo de config en mi web.config (o app.config para mis pruebas unitarias) lo hizo funcionar. Tuve que calificar el conjunto para asegurarme de que carga correctamente.

<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <qualifyAssembly 
     partialName="System.Data.SQLite" 
     fullName="System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=AMD64" /> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

En algún lugar de fontanería que es interno, durante el mapeo mediante asambleas escaneados, NHibernate crea un objeto Asamblea utilizando su nombre parcial, como una cadena, "System.Data.SQLite". De alguna manera, la versión x86 del ensamblaje se cargó.

La configuración anterior se aseguró de que usar el nombre parcial para cargar un ensamblaje proporcionaría la versión x64.

Cuestiones relacionadas