2012-08-30 12 views
9

Fluent NHibernateを使用していて、画像を保存しようとしています。小さな画像は動作しますが、大きな画像にはありませんし、データベース(SQL Serverなど)に保存するとき、私は、このエラーが表示されます。NHibernate Image Storage - バイト[長さ]の長さが、設定された長さを超えています

例外: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); 

"イメージ" プロパティは、[]バイトです。

データベースに適切なnvarchar(max)列を作成するCustomSqlTypeと長さに注意してください。私は同様の問題について話している他の投稿を無数に読んだことがありますが、この特定のエラーをカバーするものはありません。データが切り捨てられて保存されているわけではなく、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 +350

[PropertyValueException(オブジェクト IDは、ROWID、ブール[] includeProperty、 ブール[] [] includeColumns、のInt32テーブルのIDbCommand文、 ISessionImplementorセッション、のInt32インデックスオブジェクト、[]フィールドオブジェクト) : CFC.Domain.Vehicle.Image]
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(オブジェクト ID、[]フィールドオブジェクト、ROWID、ブール[] includeProperty、 ブール[] []のオブジェクトのエラー脱水プロパティ値includeColumns、Int32テーブル、IDbCommandステートメント、 ISessionImplementorセッション、Int32インデックス)+510
オブジェクトのフィールド、ブール[]、オブジェクトの[]フィールド、ブール[] includeColumns、Int32 j、IDbCommand st、ISessionImplementorセッション) +59 NHibernate.Persister.Entity(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、811
NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(オブジェクト エンティティ、オブジェクトID、IEntityPersisterの存続(オブジェクト エンティティは、のEntityKeyキーは、IEntityPersisterの存続は、ブール useIdentityColumnは、何でも、IEventSourceソース、ブール requiresImmediateIdAccessオブジェクト)ブール useIdentityColumn、何でも、IEventSourceソース、ブール requiresImmediateIdAccess)543
NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(オブジェクト エンティティ、文字列エンティティネームオブジェクト、何でも、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)を持つ別のフィールドを持っています。そして、私は長さマッピングを追加する必要はありません –

関連する問題