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

NHibernate映像存储-字节[]值的长度超过配置的长度,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我正在使用Fluent NHibernate,并试图存储图像。小图像可以工作,但大图像不行,我在保存到数据库(SQL Server)时收到此错误: 异常:对CFC.Domain.Vehicle.Image的属性值进行脱水时出错 内部异常:字节[]值的长度超过映射/参数中配置的长度 以下是我的映射: mapping.Table("Vehicle"); mapping.Id(x => x.Id, "VehicleID"); mapping.Map(x =

我正在使用Fluent 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);
“Image”属性是一个字节[]

注意CustomSqlType和length,这将在数据库中创建正确的nvarchar(max)列。我读过无数其他关于类似问题的帖子,但没有一篇涉及到这个具体错误。不是数据被截断然后保存,而是在发送SQL查询之前出错

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

我感谢你的帮助!这里是堆栈跟踪的开始(如果有帮助的话)

[HibernateException:字节[]值的长度超过了长度 在映射/参数中配置。]
NHibernate.Type.AbstractBinaryType.Set(IDbCommand cmd,对象值, Int32索引)+207
NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd,对象值, Int32索引)+397
NHibernate.Type.NullableType.NullSafeSet(IDBST命令,对象值, 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 j、IDBST命令、ISessionImplementor会话) +59 NHibernate.Persister.Entity.GenerateIdentifierBinder.BindValues(IDB命令 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(对象[]) 字段、对象对象、ISessionImplementor会话)+358
NHibernate.Action.EntityIdentityInsertAction.Execute()+262
NHibernate.Engine.ActionQueue.Execute(IExecutable可执行文件)+56
NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(对象 实体,EntityKey,EntityTyperMaster持久化器,布尔值 UseIdentity列,对象任意项,IEventSource源,布尔值 RequiremeMediatedAccess)+811
NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(对象 实体,对象id,IEntityPersister持久化器,布尔值 UseIdentity列,对象任意项,IEventSource源,布尔值 RequiremeMediatedAccess)+543
NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGenerateId(对象 实体、字符串entityName、对象任意项、IEventSource源、, 布尔值RequiremeMediatedAccess)+257


唉,有时候经过两天的研究,你只需要在StackOverflow上发布一个问题,然后就可以找到答案

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

公共类BinaryColumnLength约定:IPropertyConvention、IPropertyConventionAcceptance
{
公共无效接受(IAcceptanceCriteria标准)
{
Expect(x=>x.Property.PropertyType==typeof(byte[]);
}
公共无效应用(IPropertyInstance实例)
{
实例长度(2147483647);
CustomSqlType(“varbinary(MAX)”;
}
}

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

我知道发布回复有点晚,但我刚刚遇到了完全相同的错误。下面是我的决心——希望它能在将来帮助别人

我改变了:

Map(x => x.ByteArrayProperty);
致:


我在存储大图像时也遇到了同样的错误。我通过将length属性添加到image字段中解决了这个问题,如

,谢谢您的评论。不幸的是,没有长度也是同样的问题。我在上面添加了一个堆栈跟踪来提供帮助。如果是mssql,我们使用图像列类型。然后映射就是:
Map(x=>x.Image,“Image\u DATA”).Length(Int32.MaxValue)谢谢,这对我有用。有趣的是,海报上有这样的内容,但前面有CustomSqlType()。也许移除地图的那一部分对他来说是可以修复的,但这对我来说是有效的。但似乎只有当它被设置为懒惰时,它才会对我失败。当它不是惰性的时候,我已经有了另一个具有NVARCHAR(MAX)的字段,并且我不需要添加长度映射
Map(x => x.ByteArrayProperty);
Map(x => x.ByteArrayProperty).Length(int.MaxValue);