2010-12-12 12 views
1

Ich untersuche Fluent NHibernate in einer Desktop-Anwendung, die 3 verschiedene Datenbankdateien verwendet. (Na ja, 3 verschiedene Typen.)Wie können mehrere Datenbankänderungen gleichzeitig mit NHibernate durchgeführt werden?

  • DB1 ist die Hauptdatenbankdatei mit den Tabellen A, B, C und D.
  • DB2 ist eine Datenbank-Datei mit detaillierten Daten (X Samples pro Sekunde, Programmsitzung wird eine neue Datei erhalten, da sie sehr groß werden können) in Tabelle E.
  • DB3 ist eine Datenbankdatei, die zum Exportieren und Importieren von Daten zwischen Benutzern verwendet wird (enthält 1 Zeile von A, 1 von B und alle von E, die zu dem angegebenen gehört) Reihe von A und B)

Das Erstellen ist nicht wirklich ein Problem als die SchemaExport.Create Funktion macht das perfekt.

Das Problem, das ich gegenüberstelle, ist, dass ich nicht genau weiß, was der beste Weg ist, meine Tabellen zu ändern. Genauer gesagt, um mehrere Versionsupdates gleichzeitig durchzuführen. Meine Anwendung ist derzeit Version 1, Versand mit Datenbank-Format Version 1, nächste Woche stoße ich alles auf Version 2 - Ich kann die Datenbank mit SchemaUpdate.Execute aktualisieren - und nächsten Monat stoße ich alles auf Version 3 und ich kann das gleiche wieder tun . Aber ich möchte, dass meine Benutzer auf einmal von Version 1 auf Version 3 aktualisieren können.

Wenn ich Dinge manuell tun würde, würde ich eine Tabelle namens Version in jeder Datenbankdatei erstellen, die eine Version enthält. Ich würde dann dieses Feld gegen die aktuelle Version überprüfen und ALTER-Tabellenabfragen durchführen. Zum Beispiel:

if (db_version < LATEST_VERSION) { 
    switch (db_version + 1) { 
    case 2: Execute("ALTER TABLE A..."); Execute("UPDATE A..."); break; 
    case 3: Execute("ALTER TABLE B..."); break; 
    } 
} 

Mit diesem Ansatz (wenn die SQLite-Datenbank-Anbieter direkt verwenden) würde ich nur 1 Version meiner Datenmodell vorhersehen haben, 1-Update-Service, der alles behandelt, aber ich müsste meine Datenbank erstellen und Meine Datenmodelldateien manuell, und ich müsste mindestens zwei .db-Dateien und 2 Update-Dienste (einen für jeden db-Typ) aktualisieren. Was als Doppelarbeit gesehen werden kann. (Ich fand das database migration of Banshee ein Beispiel dessen, was ich damit meine.)

Durch die Verwendung von NHibernate eliminiere ich den Prozess der Pflege einer Datenbankdatei und eines Datenmodells, aber die einzige Möglichkeit sehe ich Updates von 1 bis 3 ist eine ältere Version jedes Datenmodell zu halten und tun so etwas wie: bei dieser

namespace Version1 { 
    public class A {} 
    DoUpdate(); 
} 

namespace Version2 { 
    public class A {} 
    DoUpdate(); 
} 

Freue ich die falsche Art und Weise ganz oder ist mein Fall einfach zu komplex und würde ich besser dran, den manuellen Ansatz? Was wäre die beste Lösung zum Aktualisieren und Migrieren von Version 1 zu 3 mit Fluent NHibernate? Oder würde jemand empfehlen, den manuellen Ansatz zu verwenden, und wenn ja, warum?

+0

Sie haben recht, normalerweise verwenden Sie einen "Migrations" -Ansatz für die Datenbankerstellung, den Sie bei jedem Schritt auf dem Weg einhalten müssen. – Chris

Antwort

2

Ich kann nicht beantworten, wie dies mit Fluent NHibernate zu tun, weil ich nie einen guten Weg gefunden habe. Meiner Meinung nach ist es nicht eingerichtet, um echte Datenbankmigrationen zu handhaben. Also, für alle meine Fluent NHibernate Projekte verwende ich http://code.google.com/p/migratordotnet/ Es ist nicht perfekt, aber es macht den Job.

+0

MigratorDotNET ist ziemlich gut, aber es sieht so aus, als hätte der Ersteller keinen Beitrag mehr geleistet: http://groups.google.com/group/migratordotnet-devel/browse_thread/thread/60c990081bda8c39. In diesem Thread sind einige Alternativen aufgeführt. –

+0

Stimme voll und ganz zu. Ich habe eine Liste der häufigsten Migrationswerkzeuge im .NET-Bereich für diese Frage zusammengestellt ... http: // stackoverflow.com/questions/4038601/nhibernate-orm-wie-ist-refactoring-behandelt-existing-data/4038866 # 4038866 –

+0

Der Schöpfer hat einige in den letzten paar Monaten beigetragen. Insgesamt ist es schon ziemlich gut und es ist einfach. Keine Notwendigkeit, Ruby zu installieren/zu installieren oder ähnliches. –

Verwandte Themen