Подтвердить что ты не робот

Можно ли создать базу данных с помощью NHibernate?

Я использую NHibernate с FluentNHibernate для моего DAL. Я также использую SchemaExport и SchemaUpdate для создания и обновления моей схемы базы данных.

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

Я знаю, что могу сделать это вручную, выполнив команду создания базы данных при подключении к основной базе данных, но это неправильно, учитывая, что я использую NHibernate для всех моих взаимодействий с базами данных. В стороне, я использую базу данных SQLite inmemory для своих модульных тестов, поэтому любой sql, который я пишу, должен будет знать, какую базу данных я использую.

Есть ли способ получить NHibernate для создания моей базы данных для меня?

4b9b3361

Ответ 2

Я думаю, что создание db с NHibernate приятно, если вы начнете разрабатывать приложение с помощью модели домена. Я имею в виду - это дает представление о том, как должен выглядеть ваш db. Но в целом - sql-скрипты должны использоваться.

Я слышал, что некоторые разработчики используют NHibernate db для тестирования интеграции, они создают легкий SQL-db на лету.

Как сгенерировать db с NHibernate? Вот как я это делаю:

 public static void InitSessionFactory()
    {
        var connectionString =
            ConfigurationManager
                .ConnectionStrings["MyConnectionString"]
                .ConnectionString;

        var cfgFromXml = new Configuration();
        cfgFromXml.Configure();

        var cfg = Fluently.Configure(cfgFromXml)
            .Database(MsSqlConfiguration.MsSql2005
                          .ConnectionString(x => x.Is(connectionString))
                          .UseReflectionOptimizer())
            .Mappings(x => x.FluentMappings
                               .AddFromAssemblyOf<NHibernateBootstrapper>())
            .ExposeConfiguration(BuildSchema);


        ObjectFactory.Inject(cfg.BuildSessionFactory());
    }

    private static void BuildSchema(Configuration config)
    {
        //Creates database structure
        //new SchemaExport(config)
        //   .Create(false, true);
    }

Ответ 3

Нет, NHibernate не будет создавать базу данных для вас. Создание баз данных - это то, что вы обычно не хотите делать "на лету". Для этого требуется множество параметров конфигурации, и это очень специфичная для конкретной базы данных, даже конкретная версия базы данных.

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

  • NHibernate создает соединение, используя его конфигурацию.
  • моя собственная реализация создает базу данных. Существуют разные реализации для разных диалектов.
  • NH создает таблицы и другие объекты базы данных
  • Классы установщика создают исходные данные

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

Ответ 4

Мы используем SchemaExport для предоставления схемы и задачи Nant для удаления и воссоздания базы данных. Другая задача Nant запускает код экспорта схемы и код dataloading, который существует в виде теста интеграции, выполняемого задачей nunit. Здесь здесь.

Ответ 5

Хм, вы действительно можете использовать SchemaExport, как вы упоминаете, но я вижу NHibernate как способ преодоления разрыва между моделью OO-домена и хранилищем реляционных сохраняемости. То есть для меня NHibernate предназначается для сохранения и извлечения объектов в моей модели домена.

Если вы хотите сделать обновления схемы, imho, вы не должны использовать NHibernate (если возможно вообще), поскольку это не цель NHibernate; есть "доменный язык", называемый SQL:), который хорош в выполнении этих вещей.

Чтобы создать мою базу данных и обновить мою схему базы данных, я использую Migrator.NET, которая представляет собой структуру, которая позволяет вам писать классы С# там, где вы указываете, что нужно сделать (создать таблицу, добавить столбец, и т.д.).
Преимущество этого заключается в том, что Migrator.NET также поддерживает несколько СУБД, поэтому вы не вписываетесь в SQL-код, специфичный для БД.