2012-08-30 17 views
9

Estoy usando Fluiber NHibernate y estoy tratando de almacenar una imagen. Pequeñas imágenes funcionan, pero las imágenes más grandes no lo hacen, y yo recibo este error al guardar en la base de datos (SQL Server):Almacenamiento de imagen de NHibernate: la longitud del valor del byte [] supera la longitud configurada

Excepción: Error valor de la propiedad deshidratante para CFC.Domain.Vehicle.Image

Excepción interna: La longitud del valor del byte [] excede la longitud configurada en la asignación/parámetro.

Aquí es mi mapeo:

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 propiedad "Imagen" es un byte [].

Tenga en cuenta CustomSqlType y la longitud, que crea la columna adecuada nvarchar (max) en la base de datos. He leído un sinnúmero de otras publicaciones hablando de problemas similares, pero ninguna cubre este error específico. No es que los datos se trunquen y luego se guarden, sino que se equivocan antes de enviar la consulta SQL.

La imagen con la que estoy probando es solo las imágenes de muestra estándar de Windows 7 (Penguins.jpg, por supuesto) pero una imagen de alrededor de 1kb funciona bien.

¡Agradezco la ayuda! Aquí está el comienzo del seguimiento de la pila si ayuda.

[HibernateException: La longitud del valor de byte [] excede la longitud configurado en el mapeo/parámetro.]
NHibernate.Type.AbstractBinaryType.Set (cmd IDbCommand, del valor del objeto, índice Int32) + 207
NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, del valor del objeto, índice Int32) 397
NHibernate.Type.NullableType.NullSafeSet (IDbCommand st, del valor del objeto, índice Int32, Boolean [] ajustable, sesión ISessionImplementor) +62
NHibernate.Persister.Entity. AbstractEntityPersister.Dehydrate (Object ID , objeto campos [], objeto ROWID, Boolean [] includeProperty, Boolean [] [] includeColumns, mesa Int32, declaración IDbCommand, sesión ISessionImplementor, índice Int32) 350

[PropertyValueException : Error deshidratante valor de propiedad para CFC.Domain.Vehicle.Image]
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object Identificación, objeto campos [], de objetos rowid, Boolean [] includeProperty, Boolean [] [] include Columnas, tabla Int32, instrucción IDbCommand, sesión ISessionImplementor, índice Int32) +510
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object Identificación, Object [] campos, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32 j, IDbCommand st, sesión ISessionImplementor) 59 NHibernate.Persister.Entity .GeneratedIdentifierBinder.BindValues ​​(IDbCommand ps) +79
NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert (SqlCommandInfo insertSQL, sesión ISessionImplementor, IBinder aglutinante) 102
NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] campos, Boolean [] notnull, SqlCommandInfo sql, Object obj, sesión ISessionImplementor) 265
NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] campos, objeto obj, sesión ISessionImplementor) 358
NHibernate.Action.EntityIdentityInsertAction.Execute (262)
NHibernate.Engine.ActionQueue.Execute (IExecutable ejecutable) +56
NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrRepl icar (Objeto entidad, clave EntityKey, IEntityPersister persister, Boolean useIdentityColumn, objeto nada, fuente IEventSource, Boolean requiresImmediateIdAccess) 811
NHibernate.Event.Default.AbstractSaveEventListener.PerformSave (Objeto entidad, ID del objeto, IEntityPersister persister, Boolean useIdentityColumn, de objetos nada, fuente IEventSource, Boolean requiresImmediateIdAccess) 543
NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId (Object entidad, cadena entityName, de objetos nada, fuente IEventSource, Boolean requiresImmediateIdAccess) 257

+0

quitar la asignación de longitud? – dotjoe

+0

Gracias por el comentario. Lamentablemente, es el mismo problema sin la longitud. Agregué un rastro de pila arriba para ayudar también. – jkriddle

Respuesta

9

Suspiro, a veces después de 2 días de investigación solo tiene que enviar una pregunta a StackOverflow para encontrar la respuesta inmediatamente después.

No estoy seguro de la razón subyacente, pero especificando la propiedad directamente cuando la asignación era el problema. Para resolver el problema, terminé creando una nueva "BinaryLengthConvention" a continuación.

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

Mágicamente, todo comenzó a funcionar. Esperemos que alguien más que busca ese mensaje de error lo encuentre útil.

+3

Si es mssql usamos tipos de columna de imagen. Entonces la asignación es justa: 'Mapa (x => x.Image," IMAGE_DATA "). Longitud (Int32.MaxValue);' –

7

Sé que es un poco tarde para publicar una respuesta, pero me encontré con este mismo error exacto. Debajo estaba mi resolución, espero que ayude a alguien más en el futuro.

me cambió:

Map(x => x.ByteArrayProperty); 

a:

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

Gracias, esto funcionó para mí. Es interesante que el póster tuviera algo así, pero con el CustomSqlType() anterior. Quizás eliminar esa parte de su mapeo también lo habría arreglado para él – PandaWood

+0

Esto funcionó para mí. pero parece que solo falla para mí cuando se establece como flojo. Cuando no es flojo, ya tengo otro campo con NVARCHAR (MAX) y no necesito agregar el mapeo de longitud –

Cuestiones relacionadas