2012-08-30 69 views
9

我正在使用流利NHibernate,并试图存储图像。小图像的工作,但较大的图像不这样做,我收到此错误时,保存到数据库(SQL Server):为CFC.Domain.Vehicle.ImageNHibernate图像存储 - 字节[]值的长度超过配置的长度

错误脱水属性值:

异常

内部异常: 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的:字节[]值的长度超过在映射/参数配置的长度 。]
NHibernate.Type.AbstractBinaryType.Set(IDbCommand的CMD,对象的值, 的Int32指数)+ 207
NHibernate.Type.NullableType.NullSafeSet(IDbCommand的CMD,对象的值, 的Int32指数)397
NHibernate.Type.NullableType.NullSafeSet(IDbCommand的ST,对象的值, 的Int32索引,布尔[]可固化,ISessionImplementor会话)+62
NHibernate.Persister.Entity。 AbstractEntityPersister.Dehydrate(对象 ID,对象[]字段,对象ROWID,布尔[] includeProperty, 布尔[] [] includeColumns,的Int32表,IDbCommand的声明, ISessionImplementor会议的Int32索引)+350

[PropertyValueException :错误脱水属性值 CFC.Domain.Vehicle.Image]
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(对象 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会话的IBinder粘合剂)102
NHibernate.Persister.Entity.AbstractEntityPersister.Insert(对象[] 字段,布尔[] NOTNULL,SqlCommandInfo SQL,对象OBJ, ISessionImplementor会话)265
NHibernate.Persister.Entity.AbstractEntityPersister.Insert(对象[] 字段,对象OBJ,ISessionImplementor会话)358
NHibernate.Action.EntityIdentityInsertAction.Execute()262
NHibernate.Engine.ActionQueue.Execute(IExecutable可执行)+56
NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrRepl icate(对象 实体的EntityKey键,IEntityPersister留存,布尔 useIdentityColumn,任何对象,IEventSource源,布尔 requiresImmediateIdAccess)811
NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(对象 实体对象ID,IEntityPersister留存,布尔 useIdentityColumn,任何对象,IEventSource源,布尔 requiresImmediateIdAccess)543
NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(对象 实体,字符串的entityName,对象什么,IEventSource源, 布尔requiresImmediateIdAccess)+257

+0

卸下长度映射? – dotjoe

+0

感谢您的评论。不幸的是,这是没有长度的同样的问题。我在上面添加了一个堆栈跟踪以帮助。 – jkriddle

回答

9

感叹,有时候在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)"); 
    } 
} 

神奇的是,它开始工作。希望其他搜索该错误消息的人发现这很有用。

+3

如果是mssql,我们使用图像列类型。然后映射只是:'Map(x => x.Image,“IMAGE_DATA”)。Length(Int32.MaxValue);' –

7

我知道发布回复有点晚了,但我刚刚遇到了这个完全相同的错误。下面是我的决议 - 希望它可以帮助未来的其他人。

我改变:

Map(x => x.ByteArrayProperty); 

到:

Map(x => x.ByteArrayProperty).Length(int.MaxValue); 
+0

谢谢,这对我很有用。有趣的是,海报有这样的东西,但与之前的CustomSqlType()。也许删除他的映射的那部分也会为他修复它 – PandaWood

+0

这对我有效。但它似乎只有在它被设置为懒惰时才会失败。当它不是懒惰时,我已经有另一个字段与NVARCHAR(MAX),我不需要添加长度映射 –

相关问题