Длина строкового значения превышает длину, заданную в параметре 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 символов.
Ответ 3
Если вы используете nHibernate Mapping By Code (Not Fluent), я нашел здесь решение:
https://groups.google.com/forum/#!topic/nhusers/uDAcP4BqFUU
Property(x => x.Description, c =>
{
c.Column("Product");
c.Type(NHibernateUtil.StringClob);
}
);
Ответ 4
Я сталкиваюсь с аналогичной проблемой, но использую CustomType
(полученный от IUserType
). Это проще, чем без специального типа. Все, что вам нужно сделать, это определить SqlTypes, чтобы явно вернуть более длинный тип длины строки, который вы хотите.
public SqlType[] SqlTypes
{
get
{
// Explicitly specify the string max length
return new SqlType[] { SqlTypeFactory.GetString(Int32.MaxValue / 2) };
}
}
Это решило проблему для нас довольно хорошо.