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);
「画像」プロパティは byte[] です。
CustomSqlType と長さに注意してください。これにより、データベースに適切な nvarchar(max) 列が作成されます。同様の問題について話している他の投稿を無数に読みましたが、この特定のエラーをカバーしているものはありません。データが切り捨てられて保存されているわけではなく、SQL クエリを送信する前にエラーが発生するだけです。
私がテストしている画像は、標準的な Windows 7 のサンプル画像 (もちろん Penguins.jpg) ですが、1kb 程度の画像でも問題なく動作します。
助けてくれてありがとう!役立つ場合は、スタック トレースの先頭を次に示します。
[ HibernateException :
byte [] 値の長さが、マッピング/パラメーターで構成された長さを超えています。
cmd、オブジェクト値、Int32 インデックス) +397
NHibernate.Type.NullableType.NullSafeSet(IDbCommand st、オブジェクト値、Int32 インデックス、Boolean[] セット可能、ISessionImplementor セッション) +62
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(オブジェクト id、 Object[] フィールド、Object rowId、Boolean[] includeProperty、Boolean[][] includeColumns、Int32 テーブル、IDbCommand ステートメント、ISessionImplementor セッション、Int32 インデックス) +350[PropertyValueException: CFC.Domain.Vehicle.Image のプロパティ値を脱水中にエラーが発生しました]
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32テーブル、IDbCommand ステートメント、ISessionImplementor セッション、Int32 インデックス) +510
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id、Object[] フィールド、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(Object[] フィールド、Boolean[] notNull、SqlCommandInfo sql、Object obj、ISessionImplementor セッション) +265
NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[] フィールド、Object obj、ISessionImplementorセッション) +358
NHibernate.Action.EntityIdentityInsertAction.Execute() +262
NHibernate.Engine.ActionQueue.Execute(IExecutable 実行可能ファイル) +56
NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(オブジェクト エンティティ、EntityKey キー、IEntityPersister 永続化、ブール値 useIdentityColumn、オブジェクトは何でも、IEventSource ソース、ブール値は ImmediateIdAccess が必要) +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なんでも、IEventSource ソース、ブール値の requiresImmediateIdAccess) +257