2012-08-30 101 views
9

我正在使用流利NHibernate,並試圖存儲圖像。小圖像的工作,但較大的圖像不這樣做,我收到此錯誤時,保存到數據庫(SQL Server):爲CFC.Domain.Vehicle.ImageNHibernate圖像存儲 - 字節[]值的長度超過配置的長度

錯誤脫水屬性值:

異常

內部異常: 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); 

「圖像」 屬性是一個字節[]。

請注意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(Object id,Object [] fields,Boolean [] includeProperty,Boolean [] [] includeColumns,Int32 j,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.PerformSaveOrRepl icate(對象 實體的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

+0

卸下長度映射? – dotjoe

+0

感謝您的評論。不幸的是,這是沒有長度的同樣的問題。我在上面添加了一個堆棧跟蹤以幫助。 – jkriddle

回答

9

感嘆,有時候在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)"); 
    } 
} 

神奇的是,它開始工作。希望其他搜索該錯誤消息的人發現這很有用。

+3

如果是mssql,我們使用圖像列類型。然後映射只是:'Map(x => x.Image,「IMAGE_DATA」)。Length(Int32.MaxValue);' –

7

我知道發佈回覆有點晚了,但我剛剛遇到了這個完全相同的錯誤。下面是我的決議 - 希望它可以幫助未來的其他人。

我改變:

Map(x => x.ByteArrayProperty); 

到:

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

謝謝,這對我很有用。有趣的是,海報有這樣的東西,但與之前的CustomSqlType()。也許刪除他的映射的那部分也會爲他修復它 – PandaWood

+0

這對我有效。但它似乎只有在它被設置爲懶惰時纔會失敗。當它不是懶惰時,我已經有另一個字段與NVARCHAR(MAX),我不需要添加長度映射 –

相關問題