Длина строкового значения превышает длину, заданную в параметре mapping/parameter

Я пытаюсь вставить очень длинный текст в строку prop - он отлично работал с LinqToSql, теперь я переключился на NHibernate и хочу сохранить тот же объект, но nHibernate выбрасывает вышеописанное исключение.

Как я могу это исправить?

Первоначально мои реквизиты были определены как:

        Map(x => x.Content, "fT_Content").Nullable();
        Map(x => x.Fields, "fT_Fields").Nullable();

теперь они: работает, но зачем мне это делать?

        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();

Примечание. У меня есть последний nhibernate с помощью nuget.

Для ref здесь находятся поля:

    public virtual string Content
    {
        get;
        set;
    }

    public virtual string Fields
    {
        get;
        set;
    }

Я хочу избежать, чтобы жить вживую, и внезапные вставки перестают работать над этой таблицей....

Ответ 1

Это хорошо известная проблема с обработкой NHibernate nvarchar (max), см.:

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

В течение нескольких лет я был сопоставлением файлов nvarchar (max) столбцов с StringClob без каких-либо проблем:

<property name="myProp" column="MY_PROP" not-null="true" type="StringClob" access="property"></property>   

Эта ссылка (из комментариев) описывает текущее сопоставление, необходимое для устранения этой проблемы:

http://www.tritac.com/bp-21-fluent-nhibernate-nvarcharmax-fields-truncated-to-4000-characters

Map(x => x.Description).CustomType("StringClob").CustomSqlType("nvarchar(max)");

Ответ 2

Максимальная длина строки по умолчанию в NHibernate - 4000 символов.

Ответ 4

Я сталкиваюсь с аналогичной проблемой, но использую CustomType (полученный от IUserType). Это проще, чем без специального типа. Все, что вам нужно сделать, это определить SqlTypes, чтобы явно вернуть более длинный тип длины строки, который вы хотите.

public SqlType[] SqlTypes
{
    get
    {
        // Explicitly specify the string max length 
        return new SqlType[] { SqlTypeFactory.GetString(Int32.MaxValue / 2) };
    }
}

Это решило проблему для нас довольно хорошо.