Пытаться понять nHibernate SchemaUpdate, даже с сообщениями в блоге - PullRequest
6 голосов
/ 16 июля 2011

Я видел различные посты в блоге, касающиеся SchemaUpdate nHibernate и даже Ayende's очень хорошего примера, и загружал примеры, но по какой-то причине я не могу заставить одну и ту же вещь работать на меня. Я отмечу, что я использую Fluent NHibernate, но из того, что я могу сказать, это не должно иметь слишком большого значения.

Обновление

Я достиг точки, в которой запускается SchemaUpdate, но это всего лишь создание полной схемы, а не «изменение». Другими словами, это так же, как если бы я только что построил базу данных свежо. Я публикую свой полный источник ниже.

Вот то, что я в основном пытаюсь ... Я думаю, что это, как правило, самоочевидно, но в основном я создаю объект Configuration с использованием Fluent Configuration, а затем пытаюсь передать его. Юнит-тесты проходят, программы запускаются ... но на самом деле ничего не происходит. Я никогда не вижу никаких результатов, и я никогда не вижу обновленной схемы базы данных.

Создание базы данных (пропущенные столбцы и т. Д.)

База данных затем сопоставляется с новой схемой при следующем запуске.

База данных (обновление) должна обновлять схему в соответствии с методом обновления.

Но это не то, что на самом деле происходит.

Я также посмотрел другие посты по этому вопросу. Как здесь: http://morten.lyhr.dk/2008/03/nhibernates-schemaupdate-feature.html

Кроме того, я изменил свой код после того, как нашел следующее сообщение о переполнении стека Обновление выходной схемы Fluent NHibernate в файл

И даже с примером кода не удалось сделать из головы или хвоста эту функцию.

Код

    private static void UpdateSchema(NHibernate.Cfg.Configuration Config) {
        System.Action<string> updateExport = x => {
            using (var file = new System.IO.FileStream(@"C:\Users\User\Documents\Visual Studio 2010\Mappings\update.sql", System.IO.FileMode.Append, System.IO.FileAccess.Write))
            using (var sw = new System.IO.StreamWriter(file)) {
                sw.Write(x);
                sw.Close();
            }
        };
        NHibernate.Tool.hbm2ddl.SchemaUpdate SchemaUpdater = new NHibernate.Tool.hbm2ddl.SchemaUpdate(Config);
        SchemaUpdater.Execute(updateExport, false);
    }

    public static ISessionFactory Map(string connectionString) {
        // fluently configure an ms-sql 2008 database
        return FluentNHibernate.Cfg.Fluently.Configure()
            .Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008
                      .ConnectionString(c => c.Is(connectionString))
                      .AdoNetBatchSize(50)
                      .FormatSql()
                      .UseReflectionOptimizer())
            .Cache(c => c
                   .ProviderClass<NHibernate.Caches.SysCache2.SysCacheProvider>()
                   .UseQueryCache()
                   .UseSecondLevelCache()
                   .UseMinimalPuts())
            .Mappings(m => {
                m.FluentMappings.Conventions.Setup(x => {
                        x.AddFromAssemblyOf<Mappings.AspectMap>();
                        x.Add<EnumConvention>();
                        x.Add(FluentNHibernate.Conventions.Helpers.AutoImport.Never());
                    });
                m.FluentMappings.AddFromAssembly(System.Reflection.Assembly.GetExecutingAssembly());
            })
            .ExposeConfiguration(UpdateSchema)
            .BuildSessionFactory();
    }

1 Ответ

5 голосов
/ 23 июля 2011

Ваш пример хорошо работает для меня (NH3.1, FNH 2.1). SchemaUpdater проверяет текущую схему базы данных и создает правильные сценарии изменения. Все сгенерированные фрагменты скрипта подвергаются UpdateSchema. Здесь нет проблем. Единственная деталь, которая меня смутила - это доступ в файловом режиме:

  1. Первый запуск карты: скрипт всей схемы базы данных хранится в файле update.sql. Обратите внимание, что там сценарий еще не выполняется, поскольку параметр doUpdate имеет значение false: SchemaUpdater.Execute(updateExport, false);
  2. Выполнить файл update.sql вручную - схема базы данных создана.
  3. Изменение в отображении FNH (например, добавлено свойство).
  4. Второй запуск карты: исправьте сценарий изменения таблицы: добавлен к файлу update.sql.

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

Сгенерированный скрипт может быть выполнен автоматически (параметр doUpdate имеет значение true):

SchemaUpdater.Execute(updateExport, true);

Я не знаю, если это ваш случай, но я счастлив сейчас - ваш фрагмент кода решил некоторые из моих проблем. Спасибо за вдохновение:).

...