2011-01-03 11 views
23

Zaktualizowałem wersję Fluent Nhibernate 1.0 z Nhibernate 2.1 do wersji pre- z wersją NHibernate 3.0 GA i osiągnąłem to, co według mnie jest regresem, ale chcę usłyszeć, czy rzeczywiście tak jest.Blot binarny obcięty do 8000 bajtów - SQL Server 2008/varbinary (max)

Używam SQL Server Express 2008 i dialekt MSSQL 2008 i mają właściwość Wizerunek typu System.Drawing.Image i ja odwzorowane go jak tym:

Map (food => food.Image) 
.Length (int.MaxValue) 
.Nullable(); 

kolumny w Image tabela jest typu varbinary(MAX).

Wygenerowany HBM dla nieruchomości wynosi:

<property name="Image" type="System.Drawing.Image, System.Drawing, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> 
    <column name="Image" length="2147483647" not-null="false" /> 
</property>` 

Jednak bez względu na to, co robię blob binarny jest obcięty do 8000 bajtów gdy odcinkach z aktualnymi wersjami FNH i NH. To nie wykorzystało w przypadku poprzednich wersji.

Pomysły na to, dlaczego tak się dzieje i jak je naprawić/obejść?

Odpowiedz

4

To jest regresja. I zgłosiły błąd i dostarczone łatki na https://nhibernate.jira.com/browse/NH-2484

+0

Mam ten sam problem z NHibernate 3.1.0.4000. czy robię coś źle? – labilbe

+0

Nie wiem - używam łatanego 3.0 i nie mogę zaktualizować do wersji 3.1, aby przetestować teraz z powodu innych pakietów w wersji 3.0. Najłatwiej byłoby pobrać test z raportu o błędzie, zamienić 3.0 na 3.1 i sprawdzić, czy nadal się wyświetla. Jeśli tak, powinniśmy ponownie otworzyć defekt i tymczasowo można użyć niestandardowego UserType dla obrazu, który wymusza wielkość danych. –

+0

Po kolejnych testach, znalazłem NH 3.1.0 już nie jest buggy. Używałem uszkodzonych danych (zapisanych w 8000 bajtów) innej wersji, wtedy miałem trudności ze znalezieniem przyczyny błędu. Teraz jest ok. Dziękuję Ci! – labilbe

0

Czy próbowałeś tego?

Map(x => x.Image).CustomSqlType("VARBINARY(MAX)"); 
+0

Tak próbowałem i to nie robi różnicy. Sprawdziłem z członkami Fluent NHibernate i nie jest to regresja po ich stronie, więc podniosłem problem nhibernate. –

5

W 3.0.0GA następujące mapowanie wydaje rade:

 <property name="Data" type="Serializable" length="2147483647" /> 
+0

tylko dodałem długość, zadziałało to dla mnie. Dzięki. –

22

Ja też mam napotkał podobny problem i po wielu eksperymentach zauważyłem, że kiedy przy użyciu Nhibernate do generowania mojego schematu do pliku generowany typ kolumny był zawsze długość 8000.

Ustawienie ustawienie CustomSqlType na Varbinary (max), jak zasugerowano powyżej, nie robi różnicy, jednak to dookoła w moim FluentMapping wydawało się zrobić lewę :

Map(x => x.LogoBytes).CustomType("BinaryBlob").Length(1048576).Nullable(); 

Długość kursu jest dowolna, ale myślę, że powinna być ustawiona na wartość mniejszą niż int.Max. Jestem nowy w Nhibernate, więc wciąż zastanawiam się nad sprawami, ale chciałbym wiedzieć, czy to ci pomoże.

+4

To poprawiło to dla mnie; jednak po prostu użyłem int.MaxValue dla długości, aby nie narzucać żadnych niskich limitów. –

+0

Od wersji nhibernate 3.2.0.4000 i fluentnhibernate 1.3.0.717 nadal musiałem użyć tego, aby przekroczyć limit 8000. – chrisortman

+0

Rozwiązanie zadziałało także dla mnie. Ponieważ używam NH 3.2.400 i mapowania według kodu, użyłem: map.Property (x => x.Image, status => status.Column (c => { c.SqlType ("VARBINARY (MAX) "); c.Length (int.MaxValue); })); –

1

Mapa (x => x.Image) .Długość (100000) .Not.Nullable();

Dodaj „Długość (MAXVALUE)” jak wyżej i będzie działać :)