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

注意:我有最新的使用 nuget 的 nhibernate。

对于参考这里是字段:

    public virtual string Content
    {
        get;
        set;
    }

    public virtual string Fields
    {
        get;
        set;
    }

我想避免去现场制作,突然插入停止在这张桌子上工作......

4

5 回答 5

75

这是 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>   

此链接(来自评论)描述了解决此问题所需的流畅映射:

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 回答
8

如果您使用 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);
   }
);
于 2013-08-07T19:41:51.850 回答
3

这是一个相当古老的问题,现在似乎有一个更直接的解决方案。我遇到了同样的问题,在映射中将列的长度设置为 Int32.MaxValue 解决了这个问题:

Map(_ => _.Body).Length(Int32.MaxValue);
于 2018-05-23T15:05:24.503 回答
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 回答