40

非常に長いテキストを文字列プロップに挿入しようとしています-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があります。

ref のフィールドは次のとおりです。

    public virtual string Content
    {
        get;
        set;
    }

    public virtual string Fields
    {
        get;
        set;
    }

ライブプロダクションに行くのを避けたいのですが、突然挿入がこのテーブルで機能しなくなりました....

4

5 に答える 5

75

これは、nvarchar(max) を処理する NHibernate に関するよく知られた問題です。以下を参照してください。

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>   

このリンク (コメントから) は、この問題を修正するために必要な流暢なマッピングについて説明しています。

https://www.tritac.com/nl/blog/fluent-nhibernate-nvarchar-max-fields-truncated-to-4000-characters/

Map(x => x.Description).CustomType("StringClob").CustomSqlType("nvarchar(max)");
于 2012-10-03T15:31:34.390 に答える
9

NHibernate のデフォルトの最大文字列長は 4000 文字です。

于 2012-10-03T14:27:59.217 に答える
0

同様の問題に遭遇しましたが、CustomType(から派生したIUserType)を使用しています。カスタムタイプがない場合よりも修正が容易であることが判明しました。必要な作業は、SqlTypes を定義して、必要な長い文字列長の型を明示的に返すことだけです。

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

これにより、問題が非常にうまく解決されました。

于 2013-01-23T22:21:08.830 に答える