web-dev-qa-db-fra.com

La longueur de la valeur de chaîne dépasse la longueur configurée dans le mappage/paramètre

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

40
Haroon

Ceci est un problème bien connu avec NHibernate traitant nvarchar (max), voir:

http://geekswithblogs.net/lszk/archive/2011/07/11/nhibernatemapping-a-string-field-as-nvarcharmax-in-sql-server-using.aspx

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)");
71
jbl

La longueur de chaîne maximale par défaut dans NHibernate est de 4 000 caractères.

9
Mr Mush

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

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.

0
Tevya

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);
0
bN_