2012-08-30 6 views
9

Ich benutze Fluent NHibernate und versuche ein Image zu speichern. Kleine Bilder arbeiten, aber auch größere Bilder nicht, und ich erhalte diese Störung, wenn auf die Datenbank (SQL Server) zu speichern:NHibernate Image Storage - Die Länge des byte [] Wertes überschreitet die konfigurierte Länge

Ausnahme: Fehler Entwässern Eigenschaftswert für CFC.Domain.Vehicle.Image

Innerer Ausnahmefehler: Die Länge des byte [] -Werts überschreitet die im Mapping/Parameter konfigurierte Länge.

Hier ist mein Mapping:

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); 

Die "Bild" Eigenschaft ist ein byte [].

Beachten Sie den CustomSqlType und die Länge, die die richtige Nvarchar (Max) -Spalte in der Datenbank erstellt. Ich habe unzählige andere Beiträge gelesen, in denen über ähnliche Probleme gesprochen wird, aber keine behandelt diesen spezifischen Fehler. Es ist nicht so, dass die Daten abgeschnitten und dann gespeichert werden, sondern nur, bevor die SQL-Abfrage gesendet wird.

Das Bild, das ich teste, ist nur die Standard Windows 7 Beispielbilder (Penguins.jpg natürlich), aber ein Bild um 1kb funktioniert gut.

Ich schätze die Hilfe! Hier ist der Anfang der Stack-Trace, wenn es hilft.

[HibernateException: Die Länge des byte [] Wert überschreitet, die Länge im Mapping/Parameter konfiguriert.]
NHibernate.Type.AbstractBinaryType.Set (IDbCommand cmd, Objektwert, Int32 index) + NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, Objektwert, Int32 index) 397
NHibernate.Type.NullableType.NullSafeSet (IDbCommand st, Objektwert, Int32 Index, Boolean [] einstellbare, ISessionImplementor Sitzung) +62
NHibernate.Persister.Entity. AbstractEntityPersister.Dehydrate (Object id, Object [] Felder, Object rowID, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32 Tabelle, IDbCommand Anweisung, ISessionImplementor Sitzung, Int32 index) +350

[PropertyValueException : Fehler Entwässern Eigenschaftswert für CFC.Domain.Vehicle.Image]
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object id, Object [] Felder, Object rowID, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32-Tabelle, IDbCommand-Anweisung, ISessionImplementor-Sitzung, Int32-Index) +510
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object id, Object [] Felder, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32 j, IDbCommand st, ISessionImplementor Sitzung) +59 NHibernate.Persister.Entity .GeneratedIdentifierBinder.BindValues ​​(IDbCommand ps) +79
NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert (SqlCommandInfo InsertSQL ISessionImplementor Sitzung, IBinder Bindemittel) +102
NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] Felder, Boolean [] NotNull, SqlCommandInfo sql, Object obj, ISessionImplementor Sitzung) +265
NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] Felder, Objekt obj, ISessionImplementor Sitzung) +358
NHibernate.Action.EntityIdentityInsertAction.Execute() +262
NHibernate.Engine.ActionQueue.Execute (IExecutable ausführbare) +56
NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrRepl icate (Object Einheit, EntityKey Schlüssel, IEntityPersister persister, Boolean useIdentityColumn, Objekt etwas, IEventSource Quelle, Boolean requiresImmediateIdAccess) 811
NHibernate.Event.Default.AbstractSaveEventListener.PerformSave (Object Entität, Objekt-ID, IEntityPersister persister, Boolean useIdentityColumn, Objekt etwas, IEventSource Quelle, Boolean requiresImmediateIdAccess) 543
NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId (Object Einheit, String entityName, Object alles, IEventSource Quelle, Boolean requiresImmediateIdAccess) +257

+0

die Länge Mapping entfernen? – dotjoe

+0

Danke für den Kommentar. Leider ist es dasselbe Problem ohne die Länge. Ich habe oben einen Stack-Trace hinzugefügt, um ebenfalls zu helfen. – jkriddle

Antwort

9

Seufzend, manchmal nach 2 Tagen der Forschung müssen Sie nur eine Frage zu StackOverflow stellen, um die Antwort gleich danach zu finden.

Ich bin mir nicht sicher über den zugrunde liegenden Grund, aber die Eigenschaft direkt angeben, wenn Mapping das Problem war. Um das Problem zu lösen, habe ich unten ein neues "BinaryLengthConvention" erstellt.

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)"); 
    } 
} 

Magisch alles begann zu arbeiten. Hoffentlich findet jemand anderes, der nach dieser Fehlermeldung sucht, das nützlich.

+3

Wenn es mssql ist, verwenden wir Bildspaltentypen. Dann ist das Mapping nur: 'Map (x => x.Image," IMAGE_DATA "). Länge (Int32.MaxValue);' –

7

Ich weiß, dass es etwas spät ist, eine Antwort zu posten, aber ich bin gerade auf genau diesen Fehler gestoßen. Unten war meine Entschließung - hoffentlich hilft es jemand anderem in der Zukunft.

I geändert:

Map(x => x.ByteArrayProperty); 

zu:

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

Danke, das hat bei mir funktioniert. Interessant, dass das Poster so etwas hatte, aber mit dem CustomSqlType() davor. Vielleicht hätte er diesen Teil seines Mappings auch für ihn repariert. – PandaWood

+0

Das hat für mich funktioniert. aber es scheint, dass es nur für mich fehlschlägt, wenn es als faul eingestellt ist. Wenn es nicht faul ist, habe ich bereits ein anderes Feld mit NVARCHAR (MAX) und ich musste nicht die Längenzuordnung hinzufügen –

Verwandte Themen