36 votes

Fluent NHibernate - Créer un schéma de base de données uniquement s'il n'existe pas

J'ai une application dans laquelle j'utilise Couramment Nhibernate pour créer ma base de données. Ce jour, j'ai été de recréer le schéma de base de données à chaque fois. Le code qui fait ce est ceci:

public NhibernateSessionFactory(IPersistenceConfigurer config)
{
    _sessionFactory = Fluently.Configure().
        Database(config).
        Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>()).
        ExposeConfiguration(BuildSchema).
        BuildSessionFactory();
}

private static void BuildSchema(Configuration config)
{
    // if (DbExists(config))
    //    return; 

    new SchemaExport(config).Create(false, true);
}

Notez le "if (DbExists(config))". C'est ce que j'aimerais faire. J'aimerais créer le schéma que si elle en fait n'existent pas déjà. Et dans la prochaine étape, j'aimerais bien la mise à jour il sera créé s'il n'est pas à jour.

Comment puis-je y parvenir? Je suis dans l'attente d'un config.DatabaseExists(), mais je ne peux pas voir quelque chose comme cela. Je vois des possibilités d'un hacky solution, mais ce qui est typique de la façon recommandée de ce traitement?

70voto

Gabe Moothart Points 12400

Vous pouvez simplement utiliser SchemaUpdate place, il mettra à jour le schéma s'il existe et le créera dans le cas contraire:

 public NhibernateSessionFactory(IPersistenceConfigurer config)
{
    _sessionFactory = Fluently.Configure().
        Database(config).
        Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>()).
        ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true)).
        BuildSessionFactory();
}
 

Une mise en garde: SchemaUpdate ne fait pas de mises à jour destructives (suppression de tables, colonnes, etc.). Il ne fera que les ajouter.

10voto

Vadim Points 12745

Mis à JOUR (merci dotjoe)

Hbm2ddl est seulement capable de faire un schéma de diff et seule une mise à jour ce qui a changé avec la SchemaUpdate classe. Cependant, cette classe est assez rudimentaire dans qu'il suffit d'un coup d'oeil à l'actuel entités et comment le schéma diffère. Si des modifications importantes ont été apportées (c'est à dire des entités supprimées ou tableaux de lien supprimé), il ne sera pas en mesure de comprendre cela.

Sur une version antérieure du projet, nous avons utilisé hbm2ddl, cependant, nous avons déménagé depuis sur utiliser Couramment Migrator. Je dirais que votre meilleur pari est d'utiliser un outil de migration, comme Couramment Migrator ou Migrator.NET.

http://github.com/schambers/fluentmigrator/

http://code.google.com/p/migratordotnet/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X