2012-08-30 9 views
9

Sto utilizzando Fluent NHibernate e sto cercando di memorizzare un'immagine. Piccole immagini funzionano, ma immagini più grandi non lo fanno, e ricevo questo errore durante il salvataggio al database (SQL Server):NHibernate Image Storage - La lunghezza del byte [] valore supera la lunghezza configurata

Eccezione: Errore valore della proprietà di disidratazione per CFC.Domain.Vehicle.Image

Eccezione interna: La lunghezza del byte [] valore supera la lunghezza configurata nella mappatura/parametro.

Ecco il mio mappatura:

mapping.Table("Vehicle"); 
mapping.Id(x => x.Id, "VehicleID"); 
mapping.Map(x => x.Year).Not.Nullable(); 
mapping.Map(x => x.Image).CustomSqlType("VARBINARY(MAX)").Length(int.MaxValue); 

La proprietà "Immagine" è un byte [].

Nota CustomSqlType e la lunghezza, che crea la colonna nvarchar (max) corretta nel database. Ho letto innumerevoli altri post che parlano di problemi simili, ma nessuno copre questo specifico errore. Non è che i dati vengano troncati e quindi salvati, ma solo errori prima di inviare la query SQL.

L'immagine che sto testando è solo le immagini campione standard di Windows 7 (Penguins.jpg ovviamente) ma un'immagine attorno a 1kb funziona correttamente.

Apprezzo l'aiuto! Ecco l'inizio della traccia dello stack, se aiuta.

[HibernateException: La lunghezza del [] valore byte supera la lunghezza configurato nella mappatura/parametro.]
NHibernate.Type.AbstractBinaryType.Set (cmd IDbCommand, Object value, indice Int32) + 207
NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, Object value, indice Int32) 397
NHibernate.Type.NullableType.NullSafeSet (IDbCommand st, Object value, indice Int32, Boolean [] impostabile, sessione ISessionImplementor) +62
NHibernate.Persister.Entity. AbstractEntityPersister.Dehydrate (Object id, oggetto [] Campi, oggetto rowId, booleano [] includeProperty, booleana [] [] includeColumns, tavolo Int32, dichiarazione IDbCommand, sessione ISessionImplementor, indice Int32) 350

[PropertyValueException : Errore disidratazione valore della proprietà per CFC.Domain.Vehicle.Image]
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object id, oggetto [] campi, oggetto rowId, booleano [] includeProperty, booleana [] [] includeColonne, tabella Int32, istruzione IDbCommand, sessione ISessionImplementor, indice Int32) +510
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object id, Object [] campi, booleano [] includeProperty, booleano [] [] includeColumns, Int32 j, IDbCommand st, sessione ISessionImplementor) 59 NHibernate.Persister.Entity .GeneratedIdentifierBinder.BindValues ​​(IDbCommand ps) +79
NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert (SqlCommandInfo InsertSQL, sessione ISessionImplementor, IBinder legante) 102
NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] campi, booleano [] notnull, SqlCommandInfo sql, Object obj, sessione ISessionImplementor) 265
NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] campi, obj Object, sessione ISessionImplementor) +358
NHibernate.Action.EntityIdentityInsertAction.Execute (+262)
NHibernate.Engine.ActionQueue.Execute (IExecutable eseguibile) +56
NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrRepl icate (Object entità, chiave EntityKey, IEntityPersister persister, booleano useIdentityColumn, oggetto qualsiasi cosa, fonte IEventSource, booleano requiresImmediateIdAccess) 811
NHibernate.Event.Default.AbstractSaveEventListener.PerformSave (Object entità, oggetto id, IEntityPersister persister, booleano useIdentityColumn, oggetto qualsiasi cosa, fonte IEventSource, booleano requiresImmediateIdAccess) 543
NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId (Object entità, String entityName, oggetto qualsiasi cosa, fonte IEventSource, booleano requiresImmediateIdAccess) 257

+0

rimuovere il mapping di lunghezza? – dotjoe

+0

Grazie per il commento. Purtroppo è lo stesso problema senza la lunghezza. Ho aggiunto una traccia di stack sopra per aiutare pure. – jkriddle

risposta

9

Sigh, a volte dopo 2 giorni di ricerca, devi solo inviare una domanda a StackOverflow per trovare la risposta subito dopo.

Non sono sicuro del motivo sottostante, ma specificando direttamente la proprietà quando la mappatura era il problema. Per risolvere il problema ho finito per creare una nuova "BinaryLengthConvention" di seguito.

public class BinaryColumnLengthConvention : IPropertyConvention, IPropertyConventionAcceptance 
{ 
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
    { 
     criteria.Expect(x => x.Property.PropertyType == typeof(byte[])); 
    } 

    public void Apply(IPropertyInstance instance) 
    { 
     instance.Length(2147483647); 
     instance.CustomSqlType("varbinary(MAX)"); 
    } 
} 

Magicamente tutto ha iniziato a funzionare. Si spera che qualcun altro che cerca quel messaggio di errore lo trovi utile.

+3

Se è mssql usiamo i tipi di colonna immagine. Quindi la mappatura è: 'Map (x => x.Image," IMAGE_DATA "). Length (Int32.MaxValue);' –

7

So che è un po 'tardi per pubblicare una risposta, ma mi sono imbattuto in questo stesso errore. Di seguito è stata la mia risoluzione - si spera che aiuti qualcun altro in futuro.

ho cambiato:

Map(x => x.ByteArrayProperty); 

a:

Map(x => x.ByteArrayProperty).Length(int.MaxValue); 
+0

Grazie, ha funzionato per me. Interessante che il poster avesse qualcosa di simile ma con CustomSqlType() prima di esso. Forse rimuovere quella parte della sua mappatura l'avrebbe risolto anche per lui – PandaWood

+0

Questo ha funzionato per me. ma sembra che fallisce solo per me quando è impostato come pigro. Quando non è pigro, ho già un altro campo con NVARCHAR (MAX) e non ho bisogno di aggiungere la mappatura della lunghezza –

Problemi correlati