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)
奇迹般地它开始工作了.希望搜索该错误消息的其他人发现这很有用.
| 归档时间: |
|
| 查看次数: |
7409 次 |
| 最近记录: |