2009-11-15 8 views
7

J'ai un champ varbinary dans ma base de données de serveur sql qui doit être varbinary (max). Je crée ma base de données avec NHibernate et j'utilise Fluent Nhibernate pour mes mappings.Fluid NHibernate, varbinary (max) et SQLite

J'utilise aussi SQLite pour mes tests unitaires, j'utilise les mêmes mappages Je change juste la configuration avant de créer la base de données en mémoire.

J'ai le problème suivant.

J'ai créé cette méthode d'extension:

public static IProperty WithMaxVarBinaryLength(this IProperty propertyMap) 
{ 
    return propertyMap.CustomSqlTypeIs("varbinary(max)"); 
} 

Il fonctionne très bien sur mon site, la base de données est créée avec un champ varbinary (max), mais quand je lance mes tests unitaires je reçois l'exception suivante

System.Data.SQLite.SQLiteException: SQLite error near "max": syntax error 

Je trouve dans une autre question sur stackoverflow que nous pouvons faire pour créer un varbinary (max):

public static IProperty WithMaxLength(this IProperty propertyMap) 
{ 
    return propertyMap.WithLengthOf(1000); 
} 

Mais je reçois cette exception:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: Content is not a string. at FluentNHibernate.Mapping.PropertyMap.WithLengthOf(Int32 length) in d:\Builds\FluentNH\src\FluentNHibernate\Mapping\PropertyMap.cs:line 166 

Pour le moment je suis sur l'idée, je ne veux pas avoir à créer manuellement tous mes scripts de base de données et je veux continuer à utiliser SQLite pour mes tests unitaires.

Merci pour l'aide. En passant, voici ma cartographie complète, notez que j'ai utilisé mes méthodes d'extension.

public class AttachmentFileMap : ClassMap<AttachmentFile> 
{ 
    public AttachmentFileMap() 
    { 
     WithTable("AttachmentFiles"); 

     Id(x => x.Id).GeneratedBy.Identity(); 
     Map(x => x.Content).WithMaxVarBinaryLength(); 
     Map(x => x.ContentType); 
     Map(x => x.FileName); 
     Map(x => x.ContentLength); 
    } 
} 

Le contenu est un octet []

Charles

Répondre

4

Enfin, je trouve que la nouvelle version de Fluent NHibernate corrige ce problème, vous pouvez maintenant utiliser .Length() après une propriété de l'octet [] tapez et cela fonctionne parfaitement.

J'ai également dû mettre à jour ma DLL Nhibernate et changer du code dans mes classes de mappings car la nouvelle version de Fluent Nhibernate a renommé certaines méthodes dans la nouvelle version.

Questions connexes