2012-08-30 15 views
9

Używam Fluent NHibernate i próbuję zapisać obraz. Małe obrazy działać, ale nie większe obrazy, a ja ten błąd przy zapisie do bazy danych (SQL Server):NHibernate Image Storage - długość wartości bajtu [] przekracza długość skonfigurowaną

Wyjątek: Error wartość właściwości odwadniających dla CFC.Domain.Vehicle.Image

Wyjątek wewnętrzny: Długość wartości bajtu [] przekracza długość skonfigurowaną w odwzorowaniu/parametrze.

Oto mój mapowania:

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

"obrazem" własność jest bajt [].

Należy zwrócić uwagę na parametr CustomSqlType i długość, który tworzy prawidłową kolumnę nvarchar (max) w bazie danych. Czytałem niezliczoną ilość innych postów mówiących o podobnych problemach, ale żaden nie obejmuje tego konkretnego błędu. Nie jest to, że dane są przycinane, a następnie zapisywane, to po prostu pomyłki przed wysłaniem zapytania SQL.

Obraz, który testuję, to tylko standardowe przykładowe obrazy systemu Windows 7 (oczywiście Penguins.jpg), ale obraz o wielkości 1kb działa dobrze.

Doceniam pomoc! Oto początek śledzenia stosu, jeśli to pomaga.

[HibernateException: długość bajtu [] Wartość większa niż długość skonfigurowany do odwzorowywania parametru /].
NHibernate.Type.AbstractBinaryType.Set (CMD IDbCommand wartość obiektu, wskaźnik Int32) + 207
NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd wartość obiektu, wskaźnik Int32) +397
NHibernate.Type.NullableType.NullSafeSet (IDbCommand St, wartość obiektu, wskaźnik Int32, logiczna [] ustawiane sesja ISessionImplementor) +62
NHibernate.Persister.Entity. AbstractEntityPersister.Dehydrate (Przedmiot id, obiekt [] Pola, obiekt RowID, logiczna [] includeProperty, logiczna [] [] includeColumns tabela Int32, rachunek IDbCommand, ISessionImplementor sesji, indeks Int32) +350

[PropertyValueException : błąd odwadniający wartości właściwości dla CFC.Domain.Vehicle.Image]
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Przedmiot identyfikatora obiektu [] pola, obiekt RowID, logiczna [] includeProperty, logiczna [] [] includeColumns, tabela Int32, instrukcja IDbCommand, Sesja ISessionImplementor, indeks Int32) +510
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Przedmiot id, obiekt [] Obszary, logiczna [] includeProperty, logiczna [] [] includeColumns, Int32 J IDbCommand st sesja ISessionImplementor) +59 NHibernate.Persister.Entity .GeneratedIdentifierBinder.BindValues ​​(IDbCommand ps) +79
NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert (SqlCommandInfo insertSQL sesja ISessionImplementor, IBinder spoiwo) +102
NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] pola, logiczna [] notNull, SqlCommandInfo SQL obj obiektu, sesji ISessionImplementor) + 265
NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] pola, OBJ Przedmiot sesja ISessionImplementor) +358
NHibernate.Action.EntityIdentityInsertAction.Execute() +262
NHibernate.Engine.ActionQueue.Execute (IExecutable wykonywalny) +56
NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrRepl icate (Przedmiot jednostka, klucz EntityKey, IEntityPersister persister, logiczna useIdentityColumn, obiekt nic źródło IEventSource, logiczna requiresImmediateIdAccess) +811
NHibernate.Event.Default.AbstractSaveEventListener.PerformSave (Przedmiot podmiot ID obiektu, IEntityPersister persister, Boolean useIdentityColumn, obiekt czegokolwiek, źródło IEventSource, Boolean requiresImmediateIdAccess) +543
NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId (Object podmiot, String entityName, obiekt czegokolwiek, źródło IEventSource, Boolean requiresImmediateIdAccess) +257

+0

Usuń mapowanie długości? – dotjoe

+0

Dzięki za komentarz. Niestety jest to ten sam problem bez długości. Dodałem również stos stosu powyżej, aby pomóc również. – jkriddle

Odpowiedz

9

Westchnienie, czasami po 2 dniach badań wystarczy, że opublikujesz pytanie do StackOverflow, aby znaleźć odpowiedź zaraz po.

Nie jestem pewien przyczyny, ale określenie właściwości bezpośrednio, gdy mapowanie było problemem. Aby rozwiązać ten problem, w końcu stworzyłem nową "BinaryLengthConvention" poniżej.

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

Magicznie wszystko zaczęło działać. Mam nadzieję, że ktoś, kto szuka tego komunikatu o błędzie, uzna to za przydatne.

+3

Jeśli jest to mssql, używamy typów kolumn obrazów. Wtedy mapowanie to po prostu: 'Map (x => x.Image," IMAGE_DATA "). Length (Int32.MaxValue);' –

7

Wiem, że jest trochę za późno na opublikowanie odpowiedzi, ale właśnie natknąłem się na ten sam błąd. Poniżej znajduje się moja rezolucja - mam nadzieję, że pomoże to komuś innemu w przyszłości.

zmieniłem:

Map(x => x.ByteArrayProperty); 

do:

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

Dzięki, to zadziałało dla mnie. Interesujące, że plakat miał coś takiego, ale z CustomSqlType() przed nim. Być może usunięcie tej części jego mapowania również ją naprawi. – PandaWood

+0

To działało dla mnie. ale wydaje się, że zawodzi tylko dla mnie, gdy jest ustawiony jako leniwy. Kiedy nie jest leniwy, mam już inne pole z NVARCHAR (MAX) i nie muszę dodawać mapowania długości –

Powiązane problemy