J'essaie d'insérer un texte très long dans un accessoire de chaîne - cela fonctionnait parfaitement avec LinqToSql. Je suis maintenant passé à NHibernate et je veux sauvegarder la même entité, mais nHibernate lève l'exception ci-dessus.
Comment puis-je réparer cela?
À l'origine, mes accessoires étaient définis comme suit:
Map(x => x.Content, "fT_Content").Nullable();
Map(x => x.Fields, "fT_Fields").Nullable();
maintenant ils sont: ça marche mais pourquoi je dois faire ça?
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();
Remarque: j'ai le dernier nhibernate utilisant nuget.
Pour ref voici les champs:
public virtual string Content
{
get;
set;
}
public virtual string Fields
{
get;
set;
}
Je veux éviter aller à la production en direct et tout d'un coup les inserts cessent de fonctionner sur cette table ....
Ceci est un problème bien connu avec NHibernate traitant nvarchar (max), voir:
Depuis quelques années, j’ai mappé des colonnes nvarchar (max) sur StringClob sans rencontrer de problème:
<property name="myProp" column="MY_PROP" not-null="true" type="StringClob" access="property"></property>
Ce lien (tiré des commentaires) décrit le mappage fluide requis pour résoudre ce problème:
http://www.tritac.com/bp-21-fluent-nhibernate-nvarcharmax-fields-truncated-to-4000-characters
Map(x => x.Description).CustomType("StringClob").CustomSqlType("nvarchar(max)");
La longueur de chaîne maximale par défaut dans NHibernate est de 4 000 caractères.
Si vous utilisez nHibernate Mapping By Code (Not Fluent), j'ai trouvé ici la solution:
https://groups.google.com/forum/#!topic/nhusers/uDAcP4BqFUU
Property(x => x.Description, c =>
{
c.Column("Product");
c.Type(NHibernateUtil.StringClob);
}
);
J'ai rencontré un problème similaire mais en utilisant une CustomType
(dérivée de IUserType
). Il s'avère être plus facile à corriger que sans un type personnalisé. Il suffit de définir SqlTypes pour renvoyer explicitement le type de longueur de chaîne le plus long souhaité.
public SqlType[] SqlTypes
{
get
{
// Explicitly specify the string max length
return new SqlType[] { SqlTypeFactory.GetString(Int32.MaxValue / 2) };
}
}
Cela a résolu le problème pour nous assez bien.
C'est une question assez ancienne et il semble qu'il existe une solution plus simple maintenant. J'ai eu le même problème et définir la longueur de la colonne à Int32.MaxValue dans le mappage a résolu le problème:
Map(_ => _.Body).Length(Int32.MaxValue);