我正在使用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
答案 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)
存储大图像时出现了相同的错误。我通过将长度属性添加到
来解决图像字段