NHibernate и изменения базы данных / развертывание - PullRequest
3 голосов
/ 09 января 2010

Я планирую использовать NHibernate и Fluent NHibernate для моего следующего проекта, но мне хотелось бы прояснить вопрос, как вы управляете изменениями в базе данных?

например, у меня есть NH +FNH работает, приложение развернуто и работает, но мы вносим изменения в среду разработки, например, скажем, мы добавляем новое свойство к объекту, который отображается с помощью NH / FNH.

Как вы применяете этоперейти в базу данных без необходимости отбрасывать таблицу?

Спасибо GE

Ответы [ 6 ]

9 голосов
/ 09 января 2010

У меня очень хороший опыт использования этого фреймворка:

http://code.google.com/p/migratordotnet/

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

Это означает, что во время разработки становится проще после каждой проверки просто слепо запускать процесс обновления БД и знать, что вы синхронизированы с миром.

using Migrator.Framework;
using System.Data;

namespace DBMigration
{
    [Migration(20080401110402)]
    public class CreateUserTable_001 : Migration
    {
            public void Up()
            {
                    Database.CreateTable("User",
                            new Column("UserId", DbType.Int32,
                            ColumnProperties.PrimaryKeyWithIdentity),
                            new Column("Username", DbType.AnsiString, 25)
                            );
            }

            public void Down()
            {
                    Database.RemoveTable("User");
            }
    }
4 голосов
/ 12 января 2010

NHibernate поддерживает класс SchemaUpdate, который может вносить некоторые изменения схемы, но не все. Некоторые подробности здесь:

Как обновить схемы таблиц базы данных с помощью схемы NHibernate?

4 голосов
/ 09 января 2010

AFAIK, вам нужно сделать это вручную. Вы можете экспортировать свою схему при каждой инициализации, но вы не можете изменять свои таблицы автоматически. Поскольку схема будет содержать только операторы создания.

Возможно, вы могли бы использовать такой инструмент, как Red Gate, чтобы найти различия в базе данных, и могли бы автоматически создавать для вас операторы. По идее,

-Создать схему в тестовой базе данных
-Запустите инструмент Красные ворота и найдите DIFF на уровне схемы.
-Создайте скрипт diff автоматически
-Примените diff на ваш основной БД

2 голосов
/ 09 января 2010

Какой бы инструмент ORM вы ни использовали, если вы вносите изменения в схему, вам придется одновременно развертывать изменения кода и схемы. Для нашего проекта это означает, что для каждого выпуска, который содержит изменения схемы, мы пишем сценарий sql, который используется для обновления базы данных. Этот скрипт запускается нашим установщиком в то же время, когда код, содержащий новые отображения гибернации, развертывается на сервере, и новое приложение не запускается до тех пор, пока не завершатся изменения схемы.

Используя эту технику, мы смогли изменять таблицы, удалять таблицы, добавлять таблицы и переносить данные из одной таблицы в другую без каких-либо серьезных проблем. Наличие сценария для выполнения изменений базы данных позволяет тщательно протестировать его перед развертыванием в производство.

1 голос
/ 28 февраля 2013

Я знаю, что это старый вопрос, но я натолкнулся на него как на лучший результат в Google, и он не упоминает инструмент, который кажется стандартным для миграций NHibernate - Fluent Migrator

1 голос
/ 12 января 2010

Это процесс, который я разработал. Я думаю, что это довольно гладко.

Процесс выглядит примерно так: предположим, у вас есть база данных MyDb

  1. Внесите изменения в модель и отображение NH
  2. Запустите сценарий для удаления, затем заново создайте базу данных с именем MyDb_Next и выполните NH SchemaExport, чтобы записать в нее новую схему
  3. Используйте мой инструмент MigrationScriptGenerator для сравнения MyDb и MyDb_next. Это сгенерирует ваши сценарии изменений (или столько, сколько это возможно) путем сравнения схемы и создания операторов для добавления новых столбцов и т. Д. Сценарий сохраняется в файле xxxx - updatescript.sql.suggested в проекте VS
  4. Исправьте предложенный сценарий sql, если необходимо (он требует вмешательства человека, когда он обнаруживает изменения, которые могут потерять данные), и переименуйте в .sql (чтобы его можно было найти на следующем шаге)
  5. Событие после сборки в проекте, содержащем сценарии sql, запускает мой инструмент simplescriptrunner это применяет сценарий sql к MyDb, обновляя его

Вы просто повторяете этот процесс всякий раз, когда меняете свои сущности. Я обычно храню свои SQL-скрипты внутри .csproj, и у меня есть событие после сборки, которое запускает simplescriptrunner. Таким образом, любой другой разработчик, который выполняет обновление и перестройку, будет иметь самую последнюю версию БД, созданную на их компьютере из проверенных пронумерованных сценариев.

MigrationScriptGenerator использует OpenDBDiff (инструмент с открытым исходным кодом, похожий на Red Gate SQL Compare) для генерации скриптов. Это может оказаться полезным, если вы хотите создавать сценарии самостоятельно.

PS эти инструменты работают только с SQL Server - извините!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...