2012-04-19 3 views
3

Я использую Fluent NHibernate для работы с моей базой данных.Данные Fluent NHibernate удалены после обновления схемы

При запуске следующего кода некоторые из них работают. Одна функция обновляет структуру таблиц, которая также работает, но мои данные исчезли.

ISessionFactory result = Fluently.Configure() 
    .Database(MySQLConfiguration.Standard.ConnectionString(connectionString)) 
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Page>()) 
    .ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, true)) 
    .BuildSessionFactory(); 

Есть ли у кого-нибудь идеи, как это решить? Таблицы должны быть обновлены, но данные не должны удаляться.

На wiki из беглого NH Я не могу найти больше информации о ExposeConfiguration.

ответ

15

SchemaExport(cfg).Create(true, true)) - вот что делает. Я не использовал Fluent, но основываясь на одном из своих проектов, на который я только что посмотрел, я думаю, что это должно быть что-то вроде SchemaUpdate(cfg).Execute(true,true)

Редактировать: Поскольку этот ответ по-прежнему помогает людям, вот более длинное объяснение.

Основное отличие здесь - объект, который мы создаем. Экземпляр SchemaExport создает DDL для создания базы данных. Метод Create генерирует скрипт, а второй параметр указывает, следует ли запускать этот скрипт в базе данных. Create вызывает Execute, передавая дополнительные параметры, в том числе тот, который говорит: «Не просто бросайте стол, бросайте его и воссоздавайте». В этом классе нет возможности не отбрасывать таблицы.

Экземпляр SchemaUpdate является гораздо более сложным зверем (внутренним), поскольку он смотрит на существующие таблицы и генерирует дельта между текущими таблицами и данными, указанными в конфигурации (я не могу найти ссылку для этого, и Я не смотрел на код, я просто знаю, что он работает). Однако в обоих случаях параметры в основном одинаковы. Первый из них - «выход ddl для консоли», а второй - «фактически запустить вещь против базы данных».

+0

Правильно, спасибо! Теперь это работает. –

+0

он работает, спасибо! –

+0

если он работает, отметьте ответ как правильный ответ. –