二进制Blob被截断为8000字节- SQL Server 2008 / varbinary(max)

23

我从Fluent Nhibernate 1.0升级到了预发布版本1.x,使用NHibernate 3.0 GA,但遇到了一个我认为是回归的问题,但我想听听是否确实如此。

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

Map (food => food.Image)
 .Length (int.MaxValue)
 .Nullable ();
属性列名类型
ImageImagevarbinary(MAX)

该表中的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>`

无论我做什么,使用当前的FNH和NH版本序列化时二进制数据块都会被截断为8000个字节。在以前的版本中并不会出现这种情况。

有什么想法可以解决或者绕过这个问题吗?

5个回答

22

我也遇到了类似的问题,经过多次尝试,我发现当使用Nhibernate将我的模式生成到文件时,生成的列类型始终为长度8000。

如上所述,将CustomSqlType设置为Varbinary(max)没有任何影响,然而,在我的FluentMapping中使用这种解决方法似乎起了作用:

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

课程长度是一个任意的值,但我认为它应该设置为小于int.Max的某个值。我刚开始使用Nhibernate,所以还在摸索中,但如果这对您有帮助,我会很感兴趣。


4
这个对我有所帮助;不过,我只是使用了int.MaxValue作为长度,以避免设置任何低限制。 - Steve Scheffler
截至 nhibernate 3.2.0.4000 和 fluentnhibernate 1.3.0.717 版本,我仍然需要使用这个方法来突破8000的限制。 - chrisortman
这个解决方案对我也起作用了。由于我使用的是NH 3.2.400和代码映射,我使用了以下代码:map.Property(x => x.Image, status => status.Column(c => { c.SqlType("VARBINARY(MAX)"); c.Length(int.MaxValue); })); - Afshar Mohebi
2
我发现将长度设置为int.MaxValue就足以解决这个问题。 - Samuel Parkinson
在NHibernate JIRA中报告的问题表明他们不会修复这个问题,但是你需要手动指定长度,因此这是解决问题的正确方法。 - Alpha

5

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

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

4

我在使用NHibernate 3.1.0.4000时遇到了同样的问题。我做错了什么吗? - labilbe
我不知道 - 我使用的是一个打了补丁的3.0版本,由于依赖于3.0的其他部分,现在无法更新到3.1版本进行测试。最简单的方法是从错误报告中获取我的测试用例,将3.0替换为3.1并查看是否仍然会报错。如果确实会报错,我们应该重新打开缺陷,暂时可以使用自定义的Image UserType来强制数据的大小。 - Ivan Zlatev
经过更多的测试,我发现 NH 3.1.0 不再有漏洞了。我使用了另一个版本保存的损坏数据(保存了8000个字节),然后我很难找出错误的原因。现在没问题了。谢谢! - labilbe

1

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

像上面那样添加 'Length(MAXVALUE)' 就可以了 :)


0

你试过这个吗?

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

是的,我已经尝试过了,但并没有任何改变。我已经与Fluent NHibernate的开发人员进行了确认,这并不是他们方面的一个退步,所以我已经提交了一个NHibernate问题。 - Ivan Zlatev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接