非常に長いテキストを文字列プロップに挿入しようとしています-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();
注:nugetを使用した最新のnhibernateがあります。
参照用のフィールドは次のとおりです。
public virtual string Content
{
get;
set;
}
public virtual string Fields
{
get;
set;
}
回避したい本番稼働に移行し、このテーブルでの突然の挿入がすべて停止します。..
これは、nvarchar(max)を処理するNHibernateの既知の問題です。以下を参照してください。
ここ数年、私はnvarchar(max)列を問題なくStringClobにファイルマッピングしています。
<property name="myProp" column="MY_PROP" not-null="true" type="StringClob" access="property"></property>
このリンク(コメントから)は、この問題を修正するために必要な流mappingなマッピングについて説明しています。
http://www.tritac.com/bp-21-fluent-nhibernate-nvarcharmax-fields-truncated-to-4000-characters
Map(x => x.Description).CustomType("StringClob").CustomSqlType("nvarchar(max)");
NHibernateのデフォルトの最大文字列長は4000文字です。
コードによるnHibernateマッピング(非流ent)を使用する場合、私はここで解決策を見つけました:
https://groups.google.com/forum/#!topic/nhusers/uDAcP4BqF
Property(x => x.Description, c =>
{
c.Column("Product");
c.Type(NHibernateUtil.StringClob);
}
);
それは非常に古い質問であり、より簡単な解決策があるようです。私は同じ問題を抱えており、マッピングで列の長さをInt32.MaxValueに設定すると問題が解決しました:
Map(_ => _.Body).Length(Int32.MaxValue);
同様の問題が発生しましたが、CustomType
(IUserType
から派生)を使用しています。カスタムタイプを使用しない場合よりも簡単に修正できることがわかりました。必要なのは、SqlTypesを定義して、必要な長い文字列の型を明示的に返すことだけです。
public SqlType[] SqlTypes
{
get
{
// Explicitly specify the string max length
return new SqlType[] { SqlTypeFactory.GetString(Int32.MaxValue / 2) };
}
}
これで問題はかなり解決しました。