Czy możliwe jest utworzenie bazy danych przy użyciu NHibernate?

Używam NHibernate z FluentNHibernate dla mojego DAL. Używam również SchemaExport i SchemaUpdate do tworzenia i aktualizacji schematu bazy danych.

Mój problem polega na tym, że wszystkie operacje schematu wymagają istnienia bazy danych, zanim zaczną działać. Chcę programowo utworzyć bazę danych i zaktualizować schemat, ponieważ może być wiele baz danych, a tworzenie bazy danych nie jest tylko jednorazową operacją.

Wiem, że mogę to zrobić ręcznie, wykonując polecenie create database na połączeniu z bazą danych master, ale wydaje się to złe, biorąc pod uwagę, że w przeciwnym razie używam NHibernate dla wszystkich moich interakcji z bazą danych. Pomijając, używam bazy danych SQLite inmemory do moich testów jednostkowych, więc każdy SQL, który piszę, będzie musiał wiedzieć, której bazy danych używam.

Czy Jest jakiś sposób, aby NHibernate utworzyło moją bazę danych dla mnie?

Author: Jeroen, 2009-05-27

6 answers

Spójrz na RhinoCommons . Pod Nosorożcem.Commons.ForTesting, in Unitofworktcontextdbstrategy.cs, Ayende zrobiła tam jakąś rutynę, która tworzy bazy danych.

 1
Author: Darnell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-27 08:12:31

Myślę, że tworzenie db z NHibernate jest miłe, jeśli zaczniesz rozwijać aplikację z modelem domeny. To daje wgląd w to, jak powinno wyglądać Twoje db. Ale ogólnie-skrypty sql powinny być używane.

Słyszałem, że niektórzy programiści używają NHibernate db generation do testów integracyjnych, tworzą lekki SQLite db w locie.

Jak wygenerować db za pomocą NHibernate? Tak to robię:

 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);
    }
 12
Author: Arnis Lapsa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-27 07:36:06

Nie, NHibernate nie utworzy dla Ciebie bazy danych. Tworzenie baz danych jest czymś, czego zwykle nie chcesz robić w locie. Wymaga wielu parametrów konfiguracyjnych i jest to bardzo specyficzne dla bazy danych, nawet dla wersji bazy danych.

Dla naszego produktu napisałem klasę, która ustawia bazę danych. Jest on używany do instalatora, testów integracyjnych i narzędzia do konserwacji bazy danych.

  • NHibernate tworzy połączenie za pomocą swojej konfiguracji.
  • moje własne implementacja tworzy bazę danych. Istnieją różne implementacje dla różnych dialektów.
  • NH tworzy tabele i inne obiekty bazy danych
  • klasy Instalatora tworzą dane początkowe

Istnieje również szczególny przypadek, w którym Klient nie chce przyznać prawa do tworzenia baz danych. Więc oczekujemy, że to zrobi i pominie tę część.

 9
Author: Stefan Steinegger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-27 08:42:08

Używamy SchemaExport, aby dostarczyć schemat i zadanie Nant, aby upuścić i odtworzyć bazę danych. Inne zadanie nant uruchamia eksport schematu i Kod ładowania danych, który istnieje w formie testu integracji uruchamianego przez zadanie nunit. Tutaj jest Próbka.

 5
Author: Matt Hinze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-27 10:58:34

Hmm, rzeczywiście można użyć SchemaExport, jak wspomniałeś, ale widzę NHibernate przede wszystkim jako sposób na wypełnienie luki między modelem domeny oo A relacyjną pamięcią trwałą. Oznacza to, że dla mnie celem NHibernate jest utrzymywanie i odzyskiwanie podmiotów w moim modelu domeny.

Jeśli chcesz zrobić aktualizacje schematu, imho, nie powinieneś używać NHibernate (jeśli to w ogóle możliwe), ponieważ nie jest to celem NHibernate; istnieje "język specyficzny dla domeny" o nazwie SQL :), który jest dobry w robieniu te rzeczy.

W celu utworzenia bazy danych i aktualizacji schematu bazy danych używam Migrator.NET , który jest frameworkiem pozwalającym na pisanie klas C#, w których określa się co należy zrobić (utworzyć tabelę, dodać kolumnę itp...).
Zaletą tego jest to, że Migrator.NET obsługuje również wiele DBMS ' ów, więc nie kończy się na pisaniu specyficznego dla DB kodu SQL.

 1
Author: Frederik Gheysels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-30 09:44:58

Szukam tego jak widziałem to w Javie-podobne pytanie tutaj: generowanie bazy danych z plików konfiguracyjnych NHibernate

 0
Author: Adam Butler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:06