12

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

4

3 に答える 3

14

返信を投稿するのが少し遅いことはわかっていますが、まったく同じエラーに遭遇しました. 以下は私の解決策でした-うまくいけば、将来誰かに役立つことを願っています.

私が変更され:

Map(x => x.ByteArrayProperty);

に:

Map(x => x.ByteArrayProperty).Length(int.MaxValue);
于 2014-10-02T12:18:43.753 に答える
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)");
    }
}

魔法のようにそれはすべて働き始めました。うまくいけば、そのエラーメッセージを検索する他の誰かがこれが役に立つと思うでしょう。

于 2012-08-30T20:22:47.570 に答える