2010-05-13 7 views
2

Je sauvegarde des fichiers binaires dans une base de données Sql Server 2005 en utilisant Fluent NHibernate. Cependant, j'utilise SQLite pour exécuter mes (pseudo) tests unitaires.NHibernate Comment spécifier le type sql personnalisé uniquement en production

J'ai besoin d'utiliser un type Sql personnalisé pour Ms Sql, mais cela provoquerait une erreur sur SqlLite. Quelles stratégies puis-je utiliser?

Ceci est le fichier de la carte:

public class BinaryFile 
{ 
public BinaryFile() 
    {   
     m.Map(x => x.BinaryData);//.CustomSqlType("varbinary(MAX)"); 
     m.Map(x => x.ContentType); 
     m.Map(x => x.FileName); 
     m.Map(x => x.FileSize); 
    } 
} 

Répondre

1

Je ne suis pas familier avec Fluent NHibernate, mais d'une façon que vous pouvez utiliser serait d'utiliser la compilation conditionnelle, donc lorsque vous êtes en mode débogage mappe une valeur, et lorsqu'il est libéré, il mappe la valeur de production.

#if DEBUG   
      m.Map(x => x.BinaryData); 
#else 
     //Map production here   
#endif 
1

Pourriez-vous utiliser différentes classes ClassMap pour chaque configuration? Vous devrez probablement ajouter explicitement chaque ClassMap à votre configuration de session Fluent, ce qui la rendrait plus verbeuse, mais cela signifierait que vous pouvez utiliser une classe de mappage différente pour les différentes bases de données.

public class BinaryFileMSSqlServer 
{ 
    public BinaryFile() 
    {   
     m.Map(x => x.BinaryData).CustomSqlType("varbinary(MAX)"); 
     m.Map(x => x.ContentType); 
     m.Map(x => x.FileName); 
     m.Map(x => x.FileSize); 
    } 
} 

public class BinaryFileSQLite 
{ 
    public BinaryFile() 
    {   
     m.Map(x => x.BinaryData); 
     m.Map(x => x.ContentType); 
     m.Map(x => x.FileName); 
     m.Map(x => x.FileSize); 
    } 
} 

Votre carte fluent session alors ressembler à quelque chose comme ceci:

Fluently.Configure() 
    .Database(MsSqlConfiguration.MsSql2005 
    .ConnectionString(c => c 
     .FromAppSetting("connectionString")) 
    .Cache(c => c 
     .UseQueryCache() 
     .ProviderClass<HashtableCacheProvider>()) 
    .ShowSql()) 
    .Mappings(m => m.FluentMappings 
     .Add<BinaryFileMSSqlServer>() 
     .Add<...>() 
     .Add<...>()) 
    .BuildSessionFactory(); 

Vous devrez remplir chacune de vos classes de mappage manuellement. Vous devez également créer une configuration fluide distincte pour SQLite, en utilisant les ClassMaps spécifiques à SQLite si nécessaire.