Question Est-il possible de créer une base de données en utilisant NHibernate?


J'utilise NHibernate avec FluentNHibernate pour ma DAL. J'utilise aussi SchemaExport et SchemaUpdate créer et mettre à jour mon schéma de base de données.

Mon problème est que les opérations de schéma exigent toutes que la base de données existe avant de pouvoir fonctionner. Je souhaite créer par programmation ma base de données et mettre à jour le schéma car il peut exister plusieurs bases de données et la création de la base de données n'est pas qu'une opération ponctuelle.

Je sais que je peux le faire manuellement en exécutant une commande de création de base de données sur une connexion à la base de données principale, mais cela ne semble pas correct, car j'utilise sinon NHibernate pour toutes mes interactions avec la base de données. En passant, j'utilise une base de données inmemory SQLite pour mes tests unitaires, donc tout SQL que j'écrirai devra alors savoir quelle base de données j'utilise.

Existe-t-il un moyen de faire en sorte que NHibernate crée ma base de données pour moi?


18
2018-05-27 07:15


origine


Réponses:


Jettes un coup d'oeil à RhinoCommons. Sous Rhino.Commons.ForTesting, dans UnitOfWorkTestContextDbStrategy.cs, Ayende a fait une routine là-bas qui crée des bases de données.


1
2018-05-27 08:12



Je pense que créer db avec NHibernate est bien si vous commencez à développer une application avec un modèle de domaine. Je veux dire - cela donne un aperçu de la façon dont votre base de données devrait ressembler. Mais en général - les scripts SQL doivent être utilisés.

J'ai entendu dire que certains développeurs utilisent la génération db de NHibernate pour les tests d'intégration, ils créent une base de données sqlite légère à la volée.

Comment générer db avec NHibernate? Voici comment je fais ça:

 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
2018-05-27 07:36



Non, NHibernate ne créera pas la base de données pour vous. La création de bases de données est quelque chose que vous ne voulez généralement pas faire à la volée. Il a besoin de nombreux paramètres de configuration et ceci est très spécifique à la base de données, même à la version de base de données.

Pour notre produit, j'ai écrit un cours qui configure la base de données. Il est utilisé pour le programme d'installation, les tests d'intégration et l'outil de maintenance de la base de données.

  • NHibernate crée la connexion en utilisant sa configuration.
  • ma propre implémentation crée la base de données. Il existe différentes implémentations pour différents dialectes.
  • NH crée les tables et autres objets de base de données
  • Les classes du programme d'installation créent des données initiales

Il existe également un cas particulier où un client ne veut pas accorder le droit de créer des bases de données. Ensuite, nous attendons de lui qu'il le fasse et saute cette partie.


9
2018-05-27 08:28



Nous utilisons SchemaExport pour fournir un schéma et une tâche Nant permettant de supprimer et de recréer la base de données. Une autre tâche Nant exécute le code d'exportation de schéma et le code de chargement de données qui existe sous la forme d'un test d'intégration exécuté par la tâche nunit. Il y a un échantillon ici.


5
2018-05-27 10:58



Hmm, vous pouvez en effet utiliser SchemaExport comme vous le mentionnez, mais je vois principalement NHibernate comme un moyen de combler le fossé entre le modèle de domaine OO et un stockage de persistance relationnelle. Autrement dit, le but de NHibernate est de persister et de récupérer des entités dans mon modèle de domaine.

Lorsque vous voulez faire des mises à jour de schéma, à mon humble avis, vous ne devez pas utiliser NHibernate (si possible), puisque ce n'est pas le but de NHibernate; il y a un "langage spécifique au domaine" appelé SQL :) qui est bon pour faire ces choses.

Pour créer ma base de données et mettre à jour mon schéma de base de données, j'utilise Migrator.NET, qui est un framework qui vous permet d'écrire des classes C # dans lesquelles vous spécifiez ce qui doit être fait (créer une table, ajouter une colonne, etc.).
L'avantage de ceci est que Migrator.NET prend également en charge plusieurs SGBD, de sorte que vous ne finissez pas par écrire du code SQL spécifique à la base de données.


1
2018-05-27 07:20



Je le cherche moi-même comme je l'ai vu en java - question similaire ici: Générer une base de données à partir des fichiers de configuration NHibernate


0
2018-05-23 22:25