2010-11-07 3 views
8

J'ai problème avec cette exception:NHibernate + SqlServerCe

Hibernate.HibernateException : Could not create the driver from Hibernate.Driver.SqlServerCeDriver. 
----> System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation. 
----> NHibernate.HibernateException : The IDbCommand and IDbConnection implementation in the ssembly System.Data.SqlServerCe could not be found. Ensure that the assembly System.Data.SqlServerCe 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. 

J'ai tout essayé. J'ai beaucoup googlé.

System.Data.SqlServerCe.dll se trouve dans le répertoire de débogage. Est-ce que local est référencé, n'est-ce pas? J'ai copie locale définie vrai. Dans le répertoire de débogage est tous les autres sql * .dll nécessaires. J'ai essayé la compilation x86 mais rien.

Voici ma config NHibernate:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 

    <property name='proxyfactory.factory_class'>NHibernate.ByteCode.Spring.ProxyFactoryFactory, NHibernate.ByteCode.Spring</property> 
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
    <property name="dialect">NHibernate.Dialect.MsSqlCeDialect</property> 
    <property name="connection.driver_class">NHibernate.Driver.SqlServerCeDriver</property> 

    <property name="show_sql">true</property> 


    <!-- mapping files --> 

    </session-factory> 
</hibernate-configuration> 

Version NHibernate 3.0 beta 1, la version SqlServerCe 3.5 SP1

Mon idée: Nhibernate regarder encore GAC, becouse un avait installé SqlServerCe, désinstaller après la le problème commence. Comment puis-je dire à NHibernate: "s'il vous plaît regardez prendre cette DLL?" :)

+0

Pouvez-vous traduire « Cíl vyvolání způsobil výjimku. »? –

+0

Je suis désolé :) J'ai oublié. Corrigée. – Simon

Répondre

11

Vous (ou la DLL de NHibernate) référençons une version différente de la DLL System.Data.SqlServerCe dans le projet que ce qu'il attend. Par exemple, NHibernate peut référencer la version .NET 3.5 de la DLL, mais vous disposez de la version .NET 4.0 de la DLL dans le répertoire GAC ou bin local. Vous pouvez demander au framework .NET d'utiliser un AssemblyBinding spécifique pour corriger le problème. Tapez le texte suivant dans votre fichier de configuration pour le réparer.

<runtime> 
    <assemblyBinding 
    xmlns="urn:schemas-microsoft-com:asm.v1"><qualifyAssembly 
    partialName="System.Data.SqlServerCe" fullName="System.Data.SqlServerCe, 
    Version=3.5.1.0, Culture=neutral, 
    PublicKeyToken=89845dcd8080cc91"/> 
    </assemblyBinding> 
    </runtime> 

+1

+1 Ceci est la *bonne réponse. –

+1

a travaillé pour moi aussi. – rohancragg

+1

N'a pas besoin de cela sur la dernière version de nHibernate, mais n'a pas pu remplacer une ancienne version et cela a résolu mon problème. – Devgig

0

Essayez de charger l'assembly avec Assembly.LoadFile avec le chemin complet de la DLL avant que NHibernate le demande. NHibernate chargera l'assembly en utilisant Assembly.Load("NHibernate.Driver.SqlServerCeDriver") qui apparaîtra probablement dans le GAC. Si vous forcez à le charger à partir d'un fichier, le Assembly.Load remarquera qu'il est déjà chargé et choisira celui que vous avez chargé.

+0

Je reçois cette erreur: System.IO.FileLoadException: Impossible de charger le fichier ou l'assembly 'System.Data.SqlServerCe, version = 3.5.0.0, Culture = neutral, PublicKeyToken = 89845dcd8080cc91 ou l'une de ses dépendances. Le système ne peut pas trouver le fichier spécifié. J'ai essayé de charger dll dépend, mais je reçois cette erreur, lorsque je tente de charger sqlceca35.dll: System.BadImageFormatException: Le module doit contenir le manifeste d'assembly. (Exception au HRESULT: 0x80131018) – Simon

+0

Votre commentaire n'a pas le message d'erreur dedans. –

+0

Désolé :) Corrigé ... – Simon

-1

Je suis passé à sqllite. C'est le travail. Peut-être envisager de changer le code de byte. J'ai utilisé le code octet de printemps, peut-être que le château est mieux ....

0

Vous pouvez également définir l'utilisation drapeau de version spécifique à false sur les propriétés dans VS pour que la vraie référence et copie ensemble local à