NHibernate的图像存储 - 字节[]值的长度超过配置的长度(NHibernate Image

2019-07-31 07:10发布

我使用功能NHibernate,我试图存储图像。 小图像的工作,但较大的图像不这样做,并保存到数据库(SQL Server)的,当我收到此错误:

例外:误差CFC.Domain.Vehicle.Image脱水属性值

内异常:字节[]值的长度超过在映射/参数配置的长度。

这里是我的映射:

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(对象ID,对象[]字段,布尔[] includeProperty,布尔[] [] includeColumns,的Int32Ĵ,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.PerformSaveOrReplicate(对象实体的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

Answer 1:

我知道这是一个有点晚发布一个答复,但我只是碰到这个确切的同样的错误来了。 下面是我的决议 - 希望这可以帮助别人,将来别人。

我变了:

Map(x => x.ByteArrayProperty);

至:

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


Answer 2:

叹了口气,有时后的研究2天,你只需要发布问题后计算器右边找到了答案。

我不知道的根本原因,但直接指定属性时,映射是问题。 要解决此问题,我结束了创建一个新的下面“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)");
    }
}

奇妙的是这一切开始工作。 希望别人,搜索该错误消息,认为这是有用的。



文章来源: NHibernate Image Storage - The length of the byte[] value exceeds the length configured