12

我正在使用 Fluent NHibernate 并尝试存储图像。小图像工作,但大图像不工作,我在保存到数据库(SQL Server)时收到此错误:

例外:为 CFC.Domain.Vehicle.Image 脱水属性值时出错

内部异常: byte[] 值的长度超过了映射/参数中配置的长度。

这是我的映射:

mapping.Table("Vehicle");
mapping.Id(x => x.Id, "VehicleID");
mapping.Map(x => x.Year).Not.Nullable();
mapping.Map(x => x.Image).CustomSqlType("VARBINARY(MAX)").Length(int.MaxValue);

“图像”属性是一个字节[]。

注意 CustomSqlType 和长度,它会在数据库中创建正确的 nvarchar(max) 列。我已经阅读了无数其他谈论类似问题的帖子,但没有一个涵盖这个特定的错误。并不是数据被截断然后保存,它只是在发送 SQL 查询之前出错。

我正在测试的图像只是标准的 Windows 7 示例图像(当然是 Penguins.jpg),但 1kb 左右的图像可以正常工作。

感谢您的帮助!如果有帮助,这里是堆栈跟踪的开头。

[HibernateException: byte[] 值的长度超过了映射/参数中配置的长度。]
NHibernate.Type.AbstractBinaryType.Set(IDbCommand cmd, Object value, Int32 index) +207
NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index) +397
NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object value, Int32 index, Boolean[] settable, ISessionImplementor session) +62
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index) +350

[PropertyValueException:为 CFC.Domain.Vehicle.Image 脱水属性值时出错]
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydra(对象 id,对象 [] 字段,对象 rowId,布尔 [] includeProperty,布尔 [][] includeColumns,Int32表,IDbCommand 语句,ISessionImplementor 会话,Int32 索引)+510
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 j, IDbCommand st, ISessionImplementor会话)+59 NHibernate.Persister.Entity.GeneratedIdentifierBinder.BindValues(IDbCommand ps)+79
NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL,ISessionImplementor session,IBinder binder)+102
NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[] fields, Boolean[] notNull, SqlCommandInfo sql, Object obj, ISessionImplementor session) +265
NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[] fields, Object obj, ISessionImplementor session) +358
NHibernate.Action.EntityIdentityInsertAction.Execute() +262
NHibernate.Engine.ActionQueue.Execute(IExecutable 可执行文件) +56
NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn,对象任何东西,IEventSource 源,布尔值 requiresImmediateIdAccess) +811
NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(对象实体,对象 id,IEntityPersister 持久化,布尔 useIdentityColumn,对象任何东西,IEventSource 源,布尔 requiresImmediateIdAccess)+543
NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(对象实体,字符串 entityName,对象任何东西,IEventSource 源,布尔值 requiresImmediateIdAccess) +257

4

3 回答 3

14

我知道发布回复有点晚了,但我刚刚遇到了同样的错误。以下是我的解决方案 - 希望它在未来对其他人有所帮助。

我变了:

Map(x => x.ByteArrayProperty);

至:

Map(x => x.ByteArrayProperty).Length(int.MaxValue);
于 2014-10-02T12:18:43.753 回答
10

叹息,有时经过 2 天的研究,您只需将问题发布到 StackOverflow 即可立即找到答案。

我不确定根本原因,但在映射出现问题时直接指定属性。为了解决这个问题,我最终在下面创建了一个新的“BinaryLengthConvention”。

public class BinaryColumnLengthConvention : IPropertyConvention, IPropertyConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType == typeof(byte[]));
    }

    public void Apply(IPropertyInstance instance)
    {
        instance.Length(2147483647);
        instance.CustomSqlType("varbinary(MAX)");
    }
}

神奇的是,这一切都开始起作用了。希望搜索该错误消息的其他人发现这很有用。

于 2012-08-30T20:22:47.570 回答
0

我在存储大图像时遇到了同样的错误。我通过将长度属性添加到图像字段来解决<property name="image" length="2147483647"/>

于 2020-07-17T17:30:17.553 回答