2010-10-27 1 views
9

Lors de l'utilisation d'un ORM (spécifiquement NHibernate), comment le refactoring des données est-il géré? Je veux dire, si les objets de données changent de telle sorte que le schéma de base de données relationnel sous-jacent change, l'ORM offre-t-il de l'aide dans les mises à niveau/rétrogradations de schéma dans la base de données? Que diriez-vous de la migration des données existantes vers le nouveau schéma? Je suis en train de prendre une décision sur l'utilisation d'un ORM et j'ai une exposition très limitée. S'il vous plaît, supportez-moi si les questions sont naïves.NHibernate, ORM: comment le refactoring est-il géré? données existantes?

Répondre

16

Dans NHibernate, vous pouvez utiliser la classe SchemaUpdate pour apporter des modifications supplémentaires à votre schéma. (Les modifications additives incluraient de nouvelles tables, de nouvelles colonnes, etc., mais pas des suppressions.) SchemaUpdate est destiné à des fins de développement et n'est pas destiné à être exécuté en production. Je recommande fortement de consulter un outil de migration SQL tel que Tarantino, dbdeploy.net, RikMigrations ou similaire.

Les outils de migration sont disponibles en deux versions - basées sur des scripts SQL (Tarantino et dbdeploy.net) et basées sur du code (migrations RikMigrations et Rails). Avec un outil de migration basé sur le code, vous écrivez vos migrations en utilisant du code écrit en C#, VB, Ruby, ... Les outils basés sur des scripts SQL prennent un ensemble ordonné de scripts SQL. Dans les deux cas, l'outil de migration exécute toutes les migrations sur votre base de données qui n'ont pas été exécutées auparavant. (En général, une table migrations énumère les scripts qui ont été exécutés et permet à l'outil de comprendre qui doivent encore être exécuté.) Les scripts SQL sont générés via:

// SchemaUpdate.Execute(bool script, bool doUpdate) 
new SchemaUpdate(cfg).Execute(true, false); 

puis édités au goût. Ou vous pouvez générer un nouveau schéma en utilisant SchemaExport de NHibernate et en utilisant un outil de comparaison de schéma tel que Microsoft Visual Studio pour Ultimate Now avec extension Mayo (aka DataDude) ou RedGate SQL Compare. Vous auriez besoin d'écrire des scripts de transformation à la main car il n'y a aucun moyen en général pour que l'outil de migration SQL sache que cette colonne Foo char (1) remplie de T/F devrait être transformée dans cette colonne Bar bit. Personnellement, je préfère les outils de migration basés sur un script SQL, car je peux générer les différences de schéma à l'aide d'un outil, puis modifier au goût plutôt que d'avoir à faire rouler la migration entière en utilisant C# ou un langage similaire.

+0

+1 pour une excellente réponse. –

+0

C'est génial. Ce serait génial de voir des liens vers d'autres ressources/blogs à ce sujet. – syclee

Questions connexes