nhibernate - fluently - La longitud del valor de cadena excede la longitud configurada en la asignación/parámetro
nhibernate download c# (4)
Este es un problema bien conocido con NHibernate manejando nvarchar (max), ver:
Desde hace algunos años, he estado asignando columnas nvarchar (max) a StringClob sin encontrar ningún problema:
<property name="myProp" column="MY_PROP" not-null="true" type="StringClob" access="property"></property>
Este enlace (de los comentarios) describe el mapeo fluido requerido para solucionar este problema:
http://www.tritac.com/bp-21-fluent-nhibernate-nvarcharmax-fields-truncated-to-4000-characters
Map(x => x.Description).CustomType("StringClob").CustomSqlType("nvarchar(max)");
Estoy tratando de insertar un texto muy largo en un apuntador de cadenas; funcionó perfectamente con LinqToSql, ahora he cambiado a NHibernate y quiero guardar la misma entidad, pero nHibernate arroja la excepción anterior.
¿Cómo puedo arreglar esto?
Originalmente mis accesorios fueron definidos como:
Map(x => x.Content, "fT_Content").Nullable();
Map(x => x.Fields, "fT_Fields").Nullable();
ahora lo son: esto funciona, pero ¿por qué tengo que hacer esto?
Map(x => x.Content, "fT_Content").CustomSqlType("nvarchar(max)").Length(Int32.MaxValue).Nullable();
Map(x => x.Fields, "fT_Fields").CustomSqlType("nvarchar(max)").Length(Int32.MaxValue).Nullable();
Nota: Tengo el último nhibernate usando Nuget.
Para ref aquí están los campos:
public virtual string Content
{
get;
set;
}
public virtual string Fields
{
get;
set;
}
Quiero evitar ir a producción en vivo y, de repente, las inserciones dejan de funcionar en esta mesa ...
Me tocó un problema similar pero usando un CustomType
(derivado de IUserType
). Resulta ser más fácil de arreglar que sin un tipo personalizado. Todo lo que necesita hacer es definir SqlTypes para devolver explícitamente el tipo de longitud de cadena más larga que desee.
public SqlType[] SqlTypes
{
get
{
// Explicitly specify the string max length
return new SqlType[] { SqlTypeFactory.GetString(Int32.MaxValue / 2) };
}
}
Esto resolvió el problema bastante bien para nosotros.
Si utiliza nHibernate Mapping By Code (No fluido) Encontré aquí la solución:
https://groups.google.com/forum/#!topic/nhusers/uDAcP4BqFUU
Property(x => x.Description, c =>
{
c.Column("Product");
c.Type(NHibernateUtil.StringClob);
}
);
La longitud de cadena máxima predeterminada en NHibernate es de 4000 caracteres.