Question

Quelle est la meilleure et la plus cohérente pour vérifier si une table existe dans NHibernate (ou avec Fluent-NHibernate)?

Est-il possible? Je veux dire, il semble être une tâche simple pour un ORM lourds.

également sur une question connexe, vous pouvez vérifier si un ensemble de tables ou un schéma tout existe avec NHibernate?

Était-ce utile?

La solution

Si vous vous enregistrez la configuration NHibernate quelque part ou le faire avant de construire votre usine de session, il est possible de valider le schéma généré contre la base de données.

    public void ValidateSchema(Configuration config)
    {
        new SchemaValidator(config).Validate();
    }

Autres conseils

Je regardais dans le code source pour SchemaUpdate. Je savais que SchemaUpdate pouvait détecter une table manquante, puis générer un script de création, plutôt que d'un script de mise à jour. Effectivement, la réponse était là.

La fonction GetTableMetadata dans l'objet NHibernate.Tool.hbm2ddl.DatabaseMetadata renvoie null si une table n'existe pas dans une base de données.

Normalement, SchemaUpdate crée un objet DataBaseMetaData et passe dans un objet Configuration. Mais il semble que tout ce que vous devez créer un DataBaseMetaData est un objet DBConnection et Dialect.

SchemaUpdate crée un DataBaseMetaData ainsi:

connectionHelper.Prepare();
connection = connectionHelper.Connection;
meta = new DatabaseMetadata(connection, dialect);

NHibernate.Cfg.Configuration appelle ensuite

ITableMetadata tableInfo = databaseMetadata.GetTableMetadata(...);

Cette question et la réponse surgissaient partout dans google lors de la recherche d'une telle solution, donc je pensais que je mettrais ce qui a fonctionné [en raison des questions l'âge, le plus probablement une addition] pour moi d'une manière plus précise et succincte; " iStable ":

var configuration = Fluently.Configure()
    .Database(MsSqlConfiguration
    .MsSql2008
    ...
    .BuildConfiguration();

    var session = configuration.BuildSessionFactory().OpenSession();

    DatabaseMetadata meta = new DatabaseMetadata((DbConnection)session.Connection, new NHibernate.Dialect.MsSql2008Dialect());
    //TABLE_NAME e.g. "hibernate_unique_key"
        if (meta.IsTable("TABLE_NAME"))
        {
        ...

L'espoir qui aide quelqu'un parce que je mis en œuvre une stratégie alambiquée similaire à ce qui précède avant de trébucher à ce sujet;)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top