【问题标题】:The length of the string value exceeds the length configured in the mapping/parameter字符串值的长度超过了映射/参数中配置的长度
【发布时间】:2012-09-24 08:41:20
【问题描述】:

我正在尝试将一些很长的文本插入到一个字符串属性中 - 它与 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;
    }

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

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案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>   
    

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

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

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

    【讨论】:

    • 所以基于链接 - 我已经使用流利的 nhibernate 正确映射?
    • 根据链接,是的。但我从未测试过它,因为 StringClob 非常适合我。我有一个带有 ntext 列的遗留数据库。使用 StringClob 允许我在将列从 ntext 转换为 nvarchar(max) 时保持相同的映射
    • 什么是 stringclob 的流利映射等价物?即什么是sytanx?
    • 我不知道。这个链接应该有帮助:tritac.com/…
    • 我们使用的一个快速解决方法是将.Length(10000) 添加到文章的映射文件中,因为我们的文章是通过所见即所得编辑器添加的。 :)
    【解决方案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】:

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

        Map(_ => _.Body).Length(Int32.MaxValue);
        

        【讨论】:

        • 2019,最简单最干净的答案。至少适用于 NH4.0。 *.hbm.xml 格式:&lt;property name="Text" type="string" length="1000000" /&gt;。当然,length 属性可以使用任何适合您的数字。
        【解决方案5】:

        我遇到了类似的问题,但使用了CustomType(源自IUserType)。事实证明,它比没有自定义类型更容易修复。您需要做的就是定义 SqlTypes 以显式返回您想要的更长的字符串长度类型。

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

        这很好地解决了我们的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-06
          • 1970-01-01
          • 2013-07-09
          • 1970-01-01
          相关资源
          最近更新 更多