2010-09-07 17 views
1

Je sais que cette question a été postée ici auparavant, et j'ai parcouru autant de réponses que je pouvais trouver, mais je ne peux toujours pas obtenir le test le plus simple au monde.FluentNhib + System.Data.SQLLite VS2010

1) J'ai créé mon test et vérifié qu'il fonctionnait dans VS2008 et ensuite ouvert la solution dans VS2010 (donc tout fonctionne correctement, et tout le code 3.5 avec toutes les références d'assemblage références 2.0/3.0/3.5)

2) I ajoute la configuration suivante

<runtime> 
    <loadFromRemoteSources enabled="true"/> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <qualifyAssembly partialName="System.Data.SQLite" fullName="System.Data.SQLite, Version=1.0.60.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" /> 
    </assemblyBinding> 
    </runtime> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 

3) I essayé l'essai contre les deux 1.0.60.0 et 1.0.66.0 x86 x64 SqlLite dll

4) I essayé dans l'exécution des tests x86 et x64 modes

Ne passe toujours pas. Qu'ai-je manqué?

(oh, et j'utilise SQLite20Driver, et une copie locale est définie sur true)

Le test est simple Configurer()

var cfg = Fluently.Configure(new NHibernate.Cfg.Configuration().Configure()) 
         .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>() 
          .Conventions.AddFromAssemblyOf<RequiredPropertyConvention>()) 
         .BuildConfiguration(); 

var sessionFactory = cfg.BuildSessionFactory(); 

Erreur

NHibernate. HibernateException: "L'implémentation IDbCommand et IDbConnection dans l'assembly System.Data.SQLite est introuvable. Assurez-vous que l'assembly System.Data.SQLite se trouve dans le répertoire de l'application ou dans le Global Assembly Assembly Cache. Si l'ensemble est en le GAC, utilisez élément dans le fichier de configuration de l'application pour spécifier le nom complet de l'assemblée. »

Stack Trace

at NHibernate.Driver.ReflectionBasedDriver..ctor(String driverAssemblyName, String connectionTypeName, String commandTypeName) 
    at NHibernate.Driver.SQLite20Driver..ctor() 
    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) 
    at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary`2 settings) 
    at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary`2 settings) 
    at NHibernate.Connection.ConnectionProvider.Configure(IDictionary`2 settings) 
    at NHibernate.Connection.ConnectionProviderFactory.NewConnectionProvider(IDictionary`2 settings) 
    at NHibernate.Cfg.SettingsFactory.BuildSettings(IDictionary`2 properties) 
    at NHibernate.Cfg.Configuration.BuildSettings() 
    at NHibernate.Cfg.Configuration.BuildSessionFactory() 

NHibernate Config

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
     <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
     <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property> 
     <property name="connection.connection_string">Data Source=nhibernate.db;Version=3</property> 
     <property name="dialect">NHibernate.Dialect.SQLiteDialect</property> 
     <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property> 
     <property name="query.substitutions">true=1, false=0</property> 
    </session-factory> 
    </hibernate-configuration> 
+0

quel est votre test, et quelle est l'erreur (avec trace de pile complète)? –

Répondre

1

Si vous migrez un projet VS2008 vers 2010, ou même si vous démarrez un nouveau projet, il est fort probable que votre proje ct fait référence à un assembly tiers qui n'a pas encore été compilé avec le framework .NET 4 (pour le moment). Pour obtenir un ensemble de V2.0 pour fonctionner dans le moteur d'exécution .Net 4, vous devez activer le mode mixte, en ajoutant ce qui suit à votre web.config/app.config:

<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
     <supportedRuntime version="v4.0"/> 
    </startup> 
</configuration> 

useLegacyV2RuntimeActivationPolicy: Cela indique la exécution pour lier des ensembles construits contre ancienne version de .NET contre l'exécution V4 au lieu des runtimes ils ont été construits avec (les forcer à utiliser V4)

supportedRuntime: Laisser .Net savoir que votre application prend en charge l'exécution V4 et charger votre application dans le runtime V4. Pour UnitTesting, ajouter ceci à l'app.config du projet contenant les TestFixtures n'est pas suffisant. Vous devez ajouter ceci à l'application.config de l'application exécutant les tests, donc pour NUnit GUI vous devez l'ajouter au fichier nunit.exe.config. En outre, vous devez vous assurer que vous utilisez une version 2.5.3+ de NUnit.

<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
    <requiredRuntime version="v4.0" /> 
    <supportedRuntime version="v4.0"/> 
    </startup> 
    <runtime> 
    <loadFromRemoteSources enabled="true" /> 
    </runtime> 
</configuration> 

loadFromRemoteSources: CAS a été dépréciés dans .Net 4 et cette ligne forces assemblées V2 de confiance partielle à être exécuté en pleine confiance.

requiredRuntime: Cela est dû au fait que NUnit a été construit sur la V2 de l'environnement d'exécution, pour charger dans V4, il doit être dit qu'il doit s'exécuter dans l'environnement d'exécution V4. (Si vous utilisez un autre coureur de test, tel que le coureur de test de ReSharper, TestDriven.Net ou le coureur de test de DXCore, vous devrez vous assurer que vous avez changé leur app.config en correspondre à ce qui précède (ou attendre que les versions .Net 4 soient libérées)

Enfin, si vous utilisez des assemblys tiers qui ont été compilés pour cibler spécifiquement x86 (il s'agira principalement d'assemblages qui envelopperont d'autres C/C++ assemblées, comme System.Data.SQLite), vous devez soit en récupérer les versions 64 bits (VS2010 est compilé par défaut en x64 lorsque vous utilisez Any CPU comme cible), soit changer votre Target en x86.