Свободный NHibernate, varbinary (max) и SQLite - PullRequest
7 голосов
/ 15 ноября 2009

В моей базе данных сервера sql есть поле varbinary, которое должно быть varbinary (max). Я создаю свою базу данных с помощью NHibernate и использую Fluent Nhibernate для своих отображений.

Я также использую SQLite для своих модульных тестов, я использую те же сопоставления, я просто изменяю конфигурацию перед созданием базы данных в памяти.

У меня возникает следующая проблема.

Я создал этот метод расширения:

 public static IProperty WithMaxVarBinaryLength(this IProperty propertyMap)
 {
     return propertyMap.CustomSqlTypeIs("varbinary(max)");
 }

На моем сайте работает нормально, база данных создается с полем varbinary (max), но когда я запускаю свои модульные тесты, я получаю следующее исключение

System.Data.SQLite.SQLiteException: SQLite error near "max": syntax error

Затем я обнаружил в другом вопросе о стековом потоке, что мы можем сделать это для создания varbinary (max):

public static IProperty WithMaxLength(this IProperty propertyMap)
{
    return propertyMap.WithLengthOf(1000);
}

Но я получаю это исключение:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: Content is not a string. at FluentNHibernate.Mapping.PropertyMap.WithLengthOf(Int32 length) in d:\Builds\FluentNH\src\FluentNHibernate\Mapping\PropertyMap.cs:line 166

На данный момент у меня нет идеи, я не хочу создавать вручную все мои скрипты базы данных, и я хочу продолжать использовать SQLite для своих модульных тестов.

Спасибо за помощь.

Кстати, вот мое полное отображение, обратите внимание, что я использовал мои методы расширения.

public class AttachmentFileMap : ClassMap<AttachmentFile>
{
    public AttachmentFileMap()
    {
        WithTable("AttachmentFiles");

        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.Content).WithMaxVarBinaryLength();
        Map(x => x.ContentType);
        Map(x => x.FileName);
        Map(x => x.ContentLength);
    }
}

Контент является байтом []

Charles

Ответы [ 2 ]

4 голосов
/ 14 июня 2011

Вы также можете столкнуться с этой проблемой при использовании SQL lite + NHibernate для модульного тестирования.

Решение состоит в том, чтобы заменить MAX на 2147483647

Полное описание можно найти здесь: http://www.tigraine.at/2009/08/17/the-fairy-tale-of-binary-blob-fields/

4 голосов
/ 15 ноября 2009

Наконец, я обнаружил, что новая версия Fluent Nhibernate исправляет эту проблему, теперь вы можете использовать .Length () после свойства типа byte [], и он отлично работает.

Мне также пришлось обновить свою библиотеку Nhibernate и изменить код в моих классах сопоставлений, потому что в новом выпуске Fluent Nhibernate некоторые методы переименованы в новом выпуске.

...