2008-12-14 3 views
53

J'essaie de comprendre comment utiliser la configuration de NHibernate avec le mappage pour mettre à jour les schémas de table, plutôt que de les supprimer et de les recréer.Comment mettre à jour les schémas de table de base de données avec la génération de schéma NHibernate?

Actuellement j'utilise l'obj NHibernate.Tool.hbm2ddl.SchemaExport avec FluentNHibernate pour générer le schéma de base de données pour une base de données mysql. Bien que je ne puisse pas dire que c'est un énorme problème, chaque fois que j'appelle SchemaExport.Execute sur la base de données, il va supprimer toutes les tables et les recréer ensuite.

Ce qui serait beaucoup plus cool, c'est si je pouvais simplement mettre à jour les structures de tables existantes en conservant les données si possible. Mais je ne veux pas vraiment utiliser un produit commercial, ou un générateur de code, parce que je n'aime pas la génération de code en général, et je n'en ai pas besoin assez pour envisager de payer pour cela. Donc j'espère que toute réponse gardera ces réserves à l'esprit.

Répondre

64

Le SchemaUpdate objet fournit une mise à jour du schéma de base de données, par apparemment générer et exécuter une série de instructions SQL UPDATE (ainsi que les déclarations de contrainte) quand il est void Execute(bool script, bool doUpdate) fonction est appelée. La classe SchemaUpdate se trouve dans l'espace de noms NHibernate.Tool.hbm2ddl, qui peut être trouvé dans le fichier Nhibernate.dll. SchemaUpdate est mentionné au chapitre 15 du guide d'outils nhibernate 1.0.2, here (section 15.1.5).

« Le NHibernate FAQ » avait (lien maintenant expiré) un exemple plus complet de l'utilisation SchemaUpdate:

[Test] 
public void Update_an_existing_database_schema() 
{ 
    _cfg = new Configuration(); 
    _cfg.Configure(); 
    _cfg.AddAssembly(Assembly.LoadFrom("DataLayer.dll")); 
    var update = new SchemaUpdate(_cfg); 
    update.Execute(true, false); 
} 
+1

nous ne pouvons pas modifier le réglage du champ une fois créé, par exemple, modifier la longueur de chaîne de nvarchar (255) à nvarchar (45), pouvons-nous? –

+0

C'est une bonne question, la version de création de hbm2ddl vous permet de faire cela, mais j'ai remarqué parfois que je dois laisser tomber les tables avant que la création ne fonctionne correctement. –

+0

Cela fonctionne brillamment, cette technique est également adaptée à Fluent NHibernate. – Contango

Questions connexes