2009-06-24 6 views
8

J'utilise le dernier NHibernate 2.1.0Beta2. Je suis en train de test unitaire avec SQLite et ont la configuration définie comme:Comment configurer SQLite pour qu'il s'exécute avec NHibernate où l'assembly résout 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); 

Lorsque je tente de l'exécuter, je reçois l'erreur suivante:

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 

Il semble donc que j'ai besoin faire référence directement à l'assemblage. Comment est-ce que je ferais ceci donc je ne reçois plus cette erreur?

J'ai téléchargé le dernier assemblage à partir d'ici: http://sourceforge.net/projects/sqlite-dotnet2.

+0

au cas où quelqu'un se rend dans cette question et est à la recherche d'une version mise à jour de cette réponse -
Le message dans mon blog sur cette question exacte est beaucoup plus à jour que les réponses ici ...
[http: // debuggerstepthrough.blogspot.co.il/2011/08/unit-testing-fluentnhibernate.html](http://debuggerstepthrough.blogspot.co.il/2011/08/unit-testing-fluentnhibernate.html) – gillyb

+0

Est-ce le code de sqlite-dotnet2 dans le répertoire de l'application? (Ou enregistré dans le GAC?) – Jay

+0

je une référence à System.Data.SQLite.DLL dans mes références du projet. Je suppose que lorsque j'exécute le test unitaire (par le biais du testeur de l'unité Resharper), il le copie. –

Répondre

12

Exécutez-vous Windows 64 bits? Lorsque j'ai regardé autour de Google, j'ai vu plusieurs articles commentant que le fichier SQLite DLL est construit pour x86, pas x64.

Voir ce post: http://codetripper.wordpress.com/2009/01/03/using-sqlite-on-vista-64-bit/

Edit: Je ne suis pas sûr que quand, mais je remarqué aujourd'hui que les dernières versions de System.Data.SQLite comprennent les dll x64. Le x64 .dll est en \bin\x64.

http://sqlite.phxsoftware.com/

+0

C'est ce qu'il a fait. Merci pour l'aide. –

+7

vous pouvez toujours définir le projet de test unitaire pour compiler à x86 (dans les propriétés du projet, construire onglet), je dois le faire si les projets sont partagés entre les développeurs qui ne sont pas tous en utilisant les fenêtres 64bit. – nachojammers

6

Après avoir ajouté la référence à l'assemblée System.Data.SQLite, je devais mettre une copie locale sur true (sélectionner la référence d'assemblage dans VS et aller aux propriétés) de telle sorte que est copié l'ensemble à la répertoire bin.

3

Si vous ne souhaitez pas utiliser la version 64 bits de System.Data.Sqlite Vous pouvez modifier la «cible de la plate-forme» (dans Visual studio project-> properties-> Build) en x86.

+0

Cela a fonctionné pour moi aussi. –

3

J'ai eu le même problème, et les solutions ci-dessus n'ont pas fonctionné pour moi. Je pense que System.Data.SQLite a changé depuis.

Notez que ce problème est spécifique à une affaire en respectant tous des critères suivants:

  • utilisant SQLite
  • avec System.Data.SqlLite
  • sur une machine x64
  • et NHibernate (2.1.2.4 dans mon cas)

Ce morceau de config dans mon web.config (ou app.config pour mes tests unitaires) a réussi à le faire fonctionner. J'ai dû qualifier l'assemblage pour être sûr qu'il se charge correctement.

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

Quelque part dans sa tuyauterie interne, au cours de la mise en correspondance en utilisant les ensembles numérisés, NHibernate crée un objet d'assemblage en utilisant son nom partiel, en tant que chaîne, « System.Data.SQLite ». D'une certaine manière, la version x86 de l'assembly a été chargée.

La configuration ci-dessus s'est assurée que l'utilisation du nom partiel pour charger un assembly fournirait la version x64.

Questions connexes