2011-01-03 3 views
23

Я обновил версию Fluent Nhibernate 1.0 с Nhibernate 2.1 до версии версии 1.x с NHibernate 3.0 GA и попал в то, что я считаю регрессией, но я хочу услышать, действительно ли это так.Binary Blob усечен до 8000 байт - SQL Server 2008/varbinary (max)

Я использую SQL Server Express 2008 и говор MSSQL 2008 и имею свойство изображения типа System.Drawing.Image и я замэпил как этого:

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

Image колонна в таблица имеет тип varbinary(MAX).

Сформированный НВМ для собственности:

<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>` 

Однако независимо от того, что я делаю блоб усекается до 8000 байт при сериализованная с текущими версиями FNH и NH. То, что не использовалось , было в случае предыдущих версий.

Идеи, почему это происходит и как их исправить/обходным путем?

ответ

4

Это регресс. Я поднял ошибку и представили патчи на https://nhibernate.jira.com/browse/NH-2484

+0

У меня такая же проблема с NHibernate 3.1.0.4000. Я делаю что-то неправильно? – labilbe

+0

Не знаю. Я использую исправленный 3.0 и не могу обновить до 3.1, чтобы протестировать прямо сейчас из-за других депов на 3.0. Проще всего было бы взять свой тестовый пример из отчета об ошибке, заменить 3.0 на 3.1 и посмотреть, все ли он бросает. Если это так, мы должны снова открыть дефект, и временно вы можете использовать пользовательский UserType для изображения, который заставляет размер данных. –

+0

После тестирования я обнаружил, что NH 3.1.0 больше не глючит. Я использовал поврежденные данные (сохраненные с 8000 байтами) другой версии, тогда мне было трудно выяснить причину ошибки. Теперь все в порядке. Спасибо! – labilbe

0

Вы пробовали это?

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

Да я попробовал это, и это не имеет никакого значения. Я проверил с Fluent NHibernate ребятами, и это не регресс на их стороне, поэтому я поднял проблему nhibernate. –

5

В 3.0.0GA следующее отображение, кажется, сделать трюк:

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

только я добавил длину, это сработало для меня. Благодарю. –

22

я тоже столкнулся с подобной проблемой, и после долгих экспериментов, я заметил, что когда используя Nhibernate для генерации моей схемы в файл, генерируемый тип столбца всегда был длиной 8000.

Настройка параметра CustomSqlType для Varbinary (max), как было предложено выше, не имеет никакого значения, однако эта работа в моем FluentMapping, похоже, сделала трюк :

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

Длина курса - это произвольная сумма, но я думаю, что она должна быть установлена ​​на что-то меньшее, чем int.Max. Я новичок в Nhibernate, поэтому я все еще разбираюсь в вещах, но мне было бы интересно узнать, поможет ли это вам.

+4

Это исправило это для меня; однако я просто использовал int.MaxValue для длины, чтобы не налагать никаких низких пределов. –

+0

Начиная с nhibernate 3.2.0.4000 и fluentnhibernate 1.3.0.717, я все еще должен был использовать это, чтобы преодолеть предел 8000. – chrisortman

+0

Решение работало и на меня. Поскольку я использую NH 3.2.400 и Mapping по коду, я использовал следующее: map.Property (x => x.Image, status => status.Column (c => { c.SqlType ("VARBINARY (" MAX) "); c.Length (int.MaxValue); })); –

1

Карта (x => x.Image). Длина (100000) .Not.Nullable();

Добавьте «Длина (MaxValue)», как указано выше, и он будет работать :)

Смежные вопросы