5

Nous avons une application qui utilise NHibernate/FluentNHibernate avec un MsSqlConfiguration.MsSql2008.ConnectionString pointé à notre environnement SQL. Les serveurs SQL ont plusieurs bases de données et nous pouvons connecter à différentes bases de données en utilisant une convention comme ceci:Lors du test de NHibernate avec une configuration SQLite en mémoire, comment créer une autre base de données?

public class FactseDatabaseConvention : IClassConvention 
{ 
    public void Apply(IClassInstance instance) 
    { 
     if (instance.EntityType.Namespace.EndsWith("Model.OtherEntities")) 
     { 
      instance.Schema("OtherDatabase.dbo"); 
     } 
    } 
} 

Cela fonctionne et les requêtes correctes sont générées pour accéder au OtherDatabase. Le problème vient quand nous voulons tester en utilisant un SQLiteConfiguration.Standard.InMemory() avec notre SessionFactory. Les tests de persistance échouent lorsque SQLite prépare:

System.Data.SQLite.SQLiteException : SQL logic error or missing database 
unknown database OtherDatabase 

Ceci est la commande qu'il génère:

create table OtherDatabse.dbo_my_other_entity_table (
     Id UNIQUEIDENTIFIER not null, 
     ... other properties 
) 

Est-il possible que je peux changer mon SQLiteConfiguration pour l'avoir créer deux bases de données en mémoire et, si c'est le cas, comment? Ou devrais-je simplement créer une session séparée pour tester ces autres entités?

Répondre

0

J'ai eu ce même problème - (plus depuis que nous sommes passés de Sqlite à Sql Server LocalDB pour les tests).

J'ai toujours le code, ce que nous avons fait a été de fournir un composant qui configure si vous souhaitez utiliser des schémas ou non, ainsi:

public class SqlLiteMappingsHelper : IMappingsHelper 
    { 
     public string TextColumnTableSpecification 
     { 
      get 
      { 
       // see sqlite faqs re: all varchars are very large whatever you specify 
       // http://www.sqlite.org/faq.html#q9 
       return "nvarchar(10)"; 
      } 
     } 

     public bool SchemasEnabled 
     { 
      get { return false; } 
     } 
    } 

(et semblable pour le serveur SQL avec SchemasEnabled = true) - dans le web app vous dites à votre conteneur IoC d'utiliser le serveur sql un et dans votre application de test que vous utilisez le Sqlite. Puis dans votre convention:

public void Apply(IClassInstance instance) 
{ 
    var helper = IoC.get<IMappingsHelper>(); 
    if (instance.EntityType.Namespace.EndsWith("Model.OtherEntities") && helper.SchemasEnabled) 
    { 
     instance.Schema("OtherDatabase.dbo"); 
    } 
} 
+0

Merci @ jenson-button-event, cela peut fonctionner. Avant de l'essayer, avez-vous des informations à partager sur la solution SQL locale? Je peux préférer essayer ça. – shanabus

+2

C'est une édition en mémoire de MSSQL Express 2012 créée pour les développeurs. Voici une [entrée de blog MSDN] (http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql-express.aspx) à ce sujet, et un lien à [télécharger MSSQL Express 2012] (http://msdn.microsoft.com/en-us/evalcenter/hh230763.aspx). Vous pouvez également l'obtenir via un abonnement MSDN si vous en avez un. Il suffit de rechercher LocalDB dans les téléchargements de l'abonné MSDN. –

Questions connexes