2009-11-15 11 views
7

Ho un campo varbinary nel mio database sql server che deve essere varbinary (max). Creo il mio database con NHibernate e utilizzo Fluent Nhibernate per i miei mapping.Fluente NHibernate, varbinary (max) e SQLite

Uso anche SQLite per i miei test di unità, utilizzo gli stessi mapping, cambio solo la configurazione prima di creare il database in memoria.

Ho il seguente problema.

Ho creato questo metodo di estensione:

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

Funziona benissimo sul mio sito web, il database viene creato con un campo varbinary (max), ma quando ho eseguito il mio test di unità ottengo la seguente eccezione

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

Poi ho trovato in un'altra domanda su StackOverflow che possiamo fare questo per creare un varbinary (max):

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

ma ottengo questa eccezione:

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 

Per il momento sono fuori di idea, io non voglio avere a creare manualmente tutti i miei script di database e voglio continuare a utilizzare SQLite per i miei test di unità.

Grazie per l'aiuto.

A proposito, ecco la mia mappatura completa, nota che ho usato i miei metodi di estensione.

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); 
    } 
} 

dei contenuti è un byte []

Charles

risposta

4

Finalmente ho scoperto che la nuova release di Fluent NHibernate risolve il problema, è ora possibile utilizzare .Length() dopo una proprietà di byte [] digita e funziona perfettamente.

Ho anche dovuto aggiornare la mia dll di Nhibernate e modificare il codice nelle mie classi di mapping perché la nuova versione di Fluent Nhibernate ha rinominato alcuni metodi nella nuova versione.

Problemi correlati