NHibernate Image Storage - byte []值的长度超过配置的长度

时间:2012-08-30 19:43:49

标签: nhibernate fluent-nhibernate

我正在使用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);

“Image”属性是一个byte []。

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

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

我很感激帮助!如果它有帮助,这是堆栈跟踪的开始。

  

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

     

[PropertyValueException:使属性值脱水的错误   CFC.Domain.Vehicle.Image]
  NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(对象   id,Object [] fields,Object rowId,Boolean [] includeProperty,   Boolean [] [] includeColumns,Int32表,IDbCommand语句,   ISessionImplementor session,Int32 index)+510
  NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(对象   id,Object [] fields,Boolean [] includeProperty,Boolean [] []   includeColumns,Int32 j,IDbCommand st,ISessionImplementor session)   +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(对象[]   fields,Boolean [] notNull,SqlCommandInfo sql,Object obj,   ISessionImplementor session)+265
  NHibernate.Persister.Entity.AbstractEntityPersister.Insert(对象[]   fields,Object obj,ISessionImplementor session)+358
  NHibernate.Action.EntityIdentityInsertAction.Execute()+262
  NHibernate.Engine.ActionQueue.Execute(IExecutable executable)+56
  NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(对象   entity,EntityKey key,IEntityPersister persister,Boolean   useIdentityColumn,Object anything,IEventSource source,Boolean   requiresImmediateIdAccess)+811
  NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(对象   entity,Object id,IEntityPersister persister,Boolean   useIdentityColumn,Object anything,IEventSource source,Boolean   requiresImmediateIdAccess)+543
  NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(对象   entity,String entityName,Object any,IEventSource source,   Boolean requiresImmediateIdAccess)+257

3 个答案:

答案 0 :(得分:12)

我知道发布回复有点迟,但我发现了同样的错误。以下是我的决议 - 希望将来可以帮助其他人。

我改变了:

Map(x => x.ByteArrayProperty);

为:

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

答案 1 :(得分: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)");
    }
}

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

答案 2 :(得分:0)

存储大图像时出现了相同的错误。我通过将长度属性添加到

来解决图像字段