【问题标题】:Binary Blob truncated to 8000 bytes - SQL Server 2008 / varbinary(max)二进制 Blob 被截断为 8000 字节 - SQL Server 2008 / varbinary(max)
【发布时间】:2011-06-02 19:41:15
【问题描述】:

我已经从 Fluent Nhibernate 1.0 和 Nhibernate 2.1 升级到 pre- 使用 NHibernate 3.0 GA 发布 1.x 并达到了我认为的回归,但我想听听是否确实如此。

我正在使用 SQL Server Express 2008 和 MSSQL 2008 方言,并且有一个 System.Drawing.Image 类型的图像属性,我已将其映射为 这个:

Map (food => food.Image)
 .Length (int.MaxValue)
 .Nullable ();

表中的Image 列的类型为varbinary(MAX)。

为属性生成的hbm是:

<property name="Image" type="System.Drawing.Image, System.Drawing,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
   <column name="Image" length="2147483647" not-null="false" />
</property>`

但是,无论我做什么,二进制 blob 都会被截断为 8000 字节 使用当前 FNH 和 NH 版本进行序列化时。那个没用 与以前的版本一样。

关于为什么会发生这种情况以及如何修复/解决它的想法?

【问题讨论】:

    标签: nhibernate fluent-nhibernate sql-server-2008-express


    【解决方案1】:

    我也遇到过类似的问题,经过大量实验后,我注意到当使用 Nhibernate 将我的架构生成到文件时,生成的列类型总是长度为 8000。

    按照上面的建议将 CustomSqlType 设置为 Varbinary(max) 没有任何区别,但是,在我的 FluentMapping 中解决这个问题似乎可以解决问题:

    Map(x => x.LogoBytes).CustomType("BinaryBlob").Length(1048576).Nullable();  
    

    当然长度是任意的,但我认为它应该设置为小于 int.Max 的值。我是 Nhibernate 的新手,所以我仍在解决问题,但我很想知道这是否对你有帮助。

    【讨论】:

    • 这为我更正了;但是,我只是将 int.MaxValue 用于 Length,以免施加任何下限。
    • 从 nhibernate 3.2.0.4000 和 fluentnhibernate 1.3.0.717 开始,我仍然必须使用它来超过 8000 的限制。
    • 该解决方案也对我有用。当我使用 NH 3.2.400 和代码映射时,我使用了以下内容: map.Property(x => x.Image, status => status.Column(c => { c.SqlType("VARBINARY(MAX)" ); c.Length(int.MaxValue); }));
    • 我发现只需将长度设置为int.MaxValue 就足以解决此问题。
    • issue reported in NHibernate JIRA 表示他们不会解决此问题,但您需要手动指定长度,因此这是解决问题的正确方法。
    【解决方案2】:

    在 3.0.0GA 中,以下映射似乎可以解决问题:

            <property name="Data" type="Serializable" length="2147483647" />
    

    【讨论】:

      【解决方案3】:

      这是一个回归。我在https://nhibernate.jira.com/browse/NH-2484提出了一个错误并提供了补丁

      【讨论】:

      • 我对 NHibernate 3.1.0.4000 有同样的问题。我做错了吗?
      • 我不知道 - 由于 3.0 上的其他依赖,我使用了修补过的 3.0,现在无法更新到 3.1 进行测试。最简单的方法是从错误报告中获取我的测试用例,将 3.0 替换为 3.1,看看它是否仍然抛出。如果是这样,我们应该重新打开缺陷,并且暂时您可以使用自定义 UserType for Image 来强制数据的大小。
      • 经过更多测试,我发现 NH 3.1.0 不再有问题了。我正在使用另一个版本的损坏数据(以 8000 字节保存),然后我很难找出错误原因。现在好了。谢谢!
      【解决方案4】:

      Map(x => x.Image).Length(100000).Not.Nullable();

      添加上面的“长度(MAXVALUE)”,它将起作用:)

      【讨论】:

        【解决方案5】:

        你试过了吗?

        Map(x => x.Image).CustomSqlType("VARBINARY(MAX)");
        

        【讨论】:

        • 是的,我已经尝试过了,没有任何区别。我已经与 Fluent NHibernate 人员核实过,这不是他们方面的倒退,所以我提出了一个 nhibernate 问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-17
        • 2015-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多