2011-01-03 13 views
23

Sono stato aggiornato da Fluent Nhibernate 1.0 con Nhibernate 2.1 aversione 1.x con NHibernate 3.0 GA e ho colpito quello che penso sia una regressione, ma voglio sentire se è davvero così.Blob binario troncato a 8000 byte - SQL Server 2008/varbinary (max)

Sto usando SQL Server Express 2008 e il dialetto MSSQL 2008 e hanno una proprietà Immagine di tipo System.Drawing.Image e ho tracciato piace questo:

Map (food => food.Image) 
.Length (int.MaxValue) 
.Nullable(); 

La colonna Image nel la tabella è di tipo varbinary(MAX).

La HBM generato per la proprietà è:

<property name="Image" type="System.Drawing.Image, System.Drawing, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> 
    <column name="Image" length="2147483647" not-null="false" /> 
</property>` 

Tuttavia, non importa quello che faccio il blob binario viene troncato a 8000 byte quando serializzato con le attuali versioni FNH e NH. Quello non ha usato per essere il caso con le versioni precedenti.

Idee del motivo per cui questo sta accadendo e come risolverlo/soluzione alternativa?

risposta

4

Questa è una regressione. Ho sollevato un bug e patch disponibili per gli ospiti https://nhibernate.jira.com/browse/NH-2484

+0

Ho lo stesso problema con NHibernate 3.1.0.4000. Sto facendo qualcosa di sbagliato? – labilbe

+0

Non lo so - io uso un patch 3.0 e non posso aggiornare a 3.1 per testare adesso a causa di altri deps su 3.0. La cosa più semplice sarebbe prendere il mio caso di test dal bug report, sostituire 3.0 con 3.1 e vedere se getta ancora. In tal caso dovremmo riaprire il difetto e temporaneamente è possibile utilizzare un UserType personalizzato per Image che impone la dimensione dei dati. –

+0

Dopo ulteriori test, ho trovato che l'NH 3.1.0 non è più buggato. Stavo usando dati corrotti (salvati con 8000 byte) di un'altra versione, quindi ho avuto difficoltà a scoprire la causa del bug. È a posto adesso. Grazie! – labilbe

0

Hai provato questo?

Map(x => x.Image).CustomSqlType("VARBINARY(MAX)"); 
+0

Sì ho provato e non fa differenza. Ho controllato con i ragazzi di Fluent NHibernate e non è una regressione dalla loro parte, quindi ho sollevato un problema irrisorio. –

5

Nel 3.0.0GA, la seguente mappatura sembra fare il trucco:

 <property name="Data" type="Serializable" length="2147483647" /> 
+0

solo ho aggiunto la lunghezza, ha funzionato per me. Grazie. –

22

anche io ho riscontrato un problema simile e dopo molti esperimenti ho notato che quando usando Nhibernate per generare il mio schema in un file il tipo di colonna generato era sempre la lunghezza 8000.

L'impostazione di impostazione CustomSqlType su Varbinary (max) come suggerito sopra non ha fatto alcuna differenza, tuttavia, questo lavoro nel mio FluentMapping sembrava fare il trucco :

Map(x => x.LogoBytes).CustomType("BinaryBlob").Length(1048576).Nullable(); 

La lunghezza è ovviamente una quantità arbitraria, ma penso che dovrebbe essere impostata su qualcosa di meno di int.Max. Sono nuovo di Nibernato, quindi sto ancora cercando di capire le cose, ma sarei interessato a sapere se questo ti aiuta.

+4

Questo lo ha corretto per me; tuttavia, ho appena usato int.MaxValue per Length in modo da non imporre limiti bassi. –

+0

A partire da NIBERNATE 3.2.0.4000 e GNUFLUIBIBILE 1.3.0.717 dovevo ancora usarlo per superare il limite di 8000. – chrisortman

+0

La soluzione ha funzionato anche per me. Come sto usando NH 3.2.400 e mappatura per codice, ho usato seguente: map.Property (x => x.Image, status => status.Column (c => { c.SqlType ("VARBINARY (MAX) "); c.Length (int.MaxValue); })); –

1

Mappa (x => x.Immagine). Lunghezza (100000) .Not.Nullable();

Aggiungere il 'Lunghezza (MAXVALUE)' come sopra e funzionerà :)

Problemi correlati