nhibernate - tiene - que es un bit
Almacenamiento de imágenes NHibernate: la longitud del valor del byte[] excede la longitud configurada (2)
Sé que es un poco tarde para publicar una respuesta, pero descubrí exactamente el mismo error. Debajo estaba mi resolución, espero que ayude a alguien más en el futuro.
Cambié:
Map(x => x.ByteArrayProperty);
a:
Map(x => x.ByteArrayProperty).Length(int.MaxValue);
Estoy usando Fluent NHibernate y estoy tratando de almacenar una imagen. Las imágenes pequeñas funcionan, pero las imágenes más grandes no, y recibo este error al guardar en la base de datos (SQL Server):
Excepción: Error al deshidratar el valor de la propiedad para CFC.Domain.Vehicle.Image
Excepción interna: la longitud del valor del byte [] excede la longitud configurada en el mapeo / parámetro.
Aquí está 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 1kb funciona bien.
Aprecio la ayuda! Aquí está el comienzo del seguimiento de la pila si ayuda.
[HibernateException: la longitud del valor del byte [] excede la longitud configurada en la asignación / parámetro.]
NHibernate.Type.AbstractBinaryType.Set (IDbCommand cmd, valor del objeto, índice Int32) +207
NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, valor del objeto, índice Int32) +397
NHibernate.Type.NullableType.NullSafeSet (IDbCommand st, Object value, Int32 index, Boolean [] settable, ISessionImplementor session) +62
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object id, Object [] fields, Object rowId, Boolean [] includeProperty, Boolean [] [] includeColumns, tabla Int32, instrucción IDbCommand, sesión ISessionImplementor, índice Int32) +350[PropertyValueException: Error al deshidratar el valor de la propiedad para CFC.Domain.Vehicle.Image]
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object id, Object [] fields, Object rowId, Boolean [] includeProperty, Boolean [] [] includeColumns, tabla Int32, instrucción IDbCommand, sesión ISessionImplementor, índice Int32) +510
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object id, Object [] fields, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32 j, IDbCommand st, ISessionImplementor session) +59 NHibernate.Persister.Entity.GeneratedIdentifierBinder.BindValues (IDbCommand ps) +79
NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert (SqlCommandInfo insertSQL, ISessionImplementor sesión, IBinder Binder) +102
NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] fields, Boolean [] notNull, SqlCommandInfo sql, Object obj, ISessionImplementor session) +265
NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] fields, Object obj, ISessionImplementor session) +358
NHibernate.Action.EntityIdentityInsertAction.Execute () +262
NHibernate.Engine.ActionQueue.Execute (ejecutable IExecutable) +56
NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate (entidad Object, clave EntityKey, IEntityPersister persister, boolean useIdentityColumn, Object anything, fuente IEventSource, boolean requiresImmediateIdAccess) +811
NHibernate.Event.Default.AbstractSaveEventListener.PerformSave (entidad de objeto, id de objeto, persistencia de IEntityPersister, boolean useIdentityColumn, Object anything, fuente de IEventSource, boolean requiresImmediateIdAccess) +543
NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId (entidad Object, String entityName, Object anything, fuente IEventSource, Boolean requiresImmediateIdAccess) +257
Suspiro, a veces después de 2 días de investigación solo tienes que publicar una pregunta en para encontrar la respuesta inmediatamente después.
No estoy seguro de la razón subyacente, pero especificando la propiedad directamente cuando el problema era el mapeo. 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.