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

18

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

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

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

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

    
задан Andrew 27.05.2009 в 09:15
источник

6 ответов

1

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

    
ответ дан Darnell 27.05.2009 в 10:12
источник
  • Спасибо, я собираюсь использовать это, это не совсем то, что я хотел (NHibernate делает работу), но это довольно круто. Я был удивлен, увидев жесткокодированную «локальную» ссылку сервера db :-) –  Andrew 27.05.2009 в 13:02
12

Я думаю, что создание 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);
    }
    
ответ дан Arnis Lapsa 27.05.2009 в 09:36
источник
9

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

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

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

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

    
ответ дан Stefan Steinegger 27.05.2009 в 10:28
источник
  • Создание базы данных SqlCe занимает всего одну строку кода: новый SqlCeEngine (string.Format ("Источник данных = '{0}';", путь)) .CreateDatabase (); –  HappyNomad 03.10.2009 в 07:03
  • Да, создание базы данных sql-сервера с использованием конфигураций по умолчанию не сложнее. Но дело не в этом. NH не делает этого, потому что это имеет смысл. –  Stefan Steinegger 05.10.2009 в 10:04
  • Это не совсем так. С NH3 вы можете использовать hbm2ddl как часть пространства имен NHibernate.Tool –  Dann 01.09.2011 в 13:32
  • @burnt_hand: интересно. Но я не могу найти какой-либо «создать базу данных» в этом коде. Как создается база данных? –  Stefan Steinegger 01.09.2011 в 16:03
  • Но это не создает базу данных, насколько я могу судить. Он просто создает схему (таблицы, индексы и т. Д.). –  Stefan Steinegger 01.09.2011 в 17:08
5

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

    
ответ дан Matt Hinze 27.05.2009 в 12:58
источник
  • +1 Yepm просто использует (новый SchemaExport (cfg)). Создайте. Работа выполнена. –  Dead account 19.08.2009 в 11:17
  • Этот код, кажется, переместился на codecampserver.codeplex.com/SourceControl/changeset/view/... –  synhershko 06.07.2010 в 14:37
1

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

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

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

    
ответ дан Frederik Gheysels 27.05.2009 в 09:20
источник
  • Спасибо, я смотрю на Migrator.Net, выглядит довольно круто, хотя это не решает мою проблему создания базы данных. –  Andrew 27.05.2009 в 12:59
0

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

    
ответ дан Adam Butler 24.05.2011 в 00:25
источник
  • Этот вопрос касается создания базы данных, а не таблиц. –  Stefan Steinegger 02.09.2011 в 12:44