2011-01-03 23 views
23

He actualizado de Fluent Nhibernate 1.0 con Nhibernate 2.1 a pre versión 1.x con NHibernate 3.0 GA y he alcanzado lo que creo que es una regresión, pero quiero saber si ese es realmente el caso.Blob binario truncado a 8000 bytes - SQL Server 2008/varbinary (max)

Estoy utilizando SQL Server Express 2008 y el dialecto MSSQL 2008 y tienen una propiedad Imagen de tipo System.Drawing.Image y me han asignado como si fuera esto:

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

La columna Image en el la tabla es del tipo varbinary(MAX).

El HBM generada por la propiedad es:

<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>` 

Sin embargo, no importa lo que haga el blob binario se trunca a 8000 bytes cuando serializado con las actuales versiones FNH y NH. Eso no usó para ser el caso con versiones anteriores.

¿Ideas de por qué sucede esto y cómo solucionarlo/solucionarlo?

Respuesta

4

Esto es una regresión. He levantado un error y parches proporcionados en https://nhibernate.jira.com/browse/NH-2484

+0

Tengo el mismo problema con NHibernate 3.1.0.4000. ¿Estoy haciendo algo mal? – labilbe

+0

No sé - Utilizo un parche 3.0 y no puedo actualizar a 3.1 para probarlo ahora debido a otras deps en 3.0. Lo más fácil sería sacar mi caso de prueba del informe de fallas, reemplazar 3.0 por 3.1 y ver si aún lo lanza. Si lo hace, deberíamos reabrir el defecto y temporalmente puede usar un UserType for Image personalizado que fuerza el tamaño de los datos. –

+0

Después de más pruebas, encontré que NH 3.1.0 ya no tiene errores. Estaba usando datos corruptos (guardados con 8000 bytes) de otra versión, luego tuve dificultades para descubrir la causa del error. Ahora está bien. ¡Gracias! – labilbe

0

¿Has probado esto?

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

sí he probado y no hace ninguna diferencia. He consultado con los chicos de Fluiber NHibernate y no es una regresión de su parte, así que planteé un problema de nhibernato. –

5

En 3.0.0GA, la siguiente asignación parece hacer el truco:

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

solo agregué longitud, funcionó para mí. Gracias. –

22

yo también he encontrado un problema similar y después de mucha experimentación me di cuenta de que cuando El uso de Nhibernate para generar mi esquema en un archivo el tipo de columna generada siempre fue 8000.

Establecer el valor de CustomSqlType en Varbinary (max) como se sugirió anteriormente no hizo diferencia, sin embargo, este trabajo en mi FluentMapping pareció ser el truco :

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

La duración del curso es una cantidad arbitraria, pero creo que debería establecerse en algo menos que int.Max. Soy nuevo en Nhibernate, así que todavía estoy averiguando las cosas, pero me gustaría saber si esto te ayuda.

+4

Esto me lo corrigió; sin embargo, acabo de utilizar int.MaxValue para Length para no imponer ningún límite bajo. –

+0

A partir de nhibernate 3.2.0.4000 y fluentnhibernate 1.3.0.717 todavía tenía que usar esto para superar el límite de 8000. – chrisortman

+0

La solución funcionó para mí también. Como estoy usando NH 3.2.400 y Mapping por código, utilicé lo siguiente: map.Property (x => x.Image, status => status.Column (c => { c.SqlType ("VARBINARY (MAX) "); c.Length (int.MaxValue); })); –

1

Mapa (x => x.Image) .Length (100000) .Not.Nullable();

Añadir el 'Longitud (MAXVALUE)' como antes y se va a trabajar :)

Cuestiones relacionadas