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

jkr*_*dle 11 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);
Run Code Online (Sandbox Code Playgroud)

"Image"属性是byte [].

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

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

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

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

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

spy*_*ter 13

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

我变了:

Map(x => x.ByteArrayProperty);
Run Code Online (Sandbox Code Playgroud)

至:

Map(x => x.ByteArrayProperty).Length(int.MaxValue);
Run Code Online (Sandbox Code Playgroud)


jkr*_*dle 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)");
    }
}
Run Code Online (Sandbox Code Playgroud)

奇迹般地它开始工作了.希望搜索该错误消息的其他人发现这很有用.

  • 如果是mssql,我们使用图像列类型.然后映射就是:`Map(x => x.Image,"IMAGE_DATA").Length(Int32.MaxValue);` (3认同)