Можно ли создать базу данных с помощью NHibernate? - PullRequest
18 голосов
/ 27 мая 2009

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

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

Я знаю, что могу сделать это вручную, выполнив команду create database при подключении к основной базе данных, но это неправильно, учитывая, что в противном случае я использую NHibernate для всех моих взаимодействий с базой данных. Кроме того, я использую базу данных памяти SQLite для своих модульных тестов, поэтому любой SQL-файл, который я пишу, должен будет знать, какую базу данных я использую.

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

Ответы [ 6 ]

12 голосов
/ 27 мая 2009

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

Я слышал, что некоторые разработчики используют генерацию БД NHibernate для интеграционных тестов, они создают облегченные БД sqlite на лету.

Как сгенерировать БД с помощью 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);
    }
9 голосов
/ 27 мая 2009

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

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

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

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

5 голосов
/ 27 мая 2009

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

1 голос
/ 27 мая 2009

Посмотрите на RhinoCommons . Под Rhino.Commons.ForTesting в UnitOfWorkTestContextDbStrategy.cs , Ayende выполнил некоторую процедуру, которая создает базы данных.

1 голос
/ 27 мая 2009

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

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

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

0 голосов
/ 24 мая 2011

Ищите это сам, как я видел это в java - похожий вопрос здесь: Создание базы данных из файлов конфигурации NHibernate

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