2008-12-14 11 views
53

Ich versuche herauszufinden, wie die NHibernate-Konfiguration mit Mapping verwendet wird, um Tabellenschemas zu aktualisieren, anstatt sie zu löschen und neu zu erstellen.Wie Aktualisieren von Datenbanktabellenschemas mit NHibernate-Schemagenerierung?

Derzeit verwende ich das NHibernate.Tool.hbm2ddl.SchemaExport Obj mit FluentNHibernate, um das Datenbankschema für eine MySQL-Datenbank zu generieren. Während ich nicht sagen kann, dass es ein riesiges Problem ist, wenn ich SchemaExport.Execute in der Datenbank anrufe, wird es alle Tabellen fallen lassen und sie dann neu erstellen.

Was wäre viel cooler, wenn ich es nur die vorhandenen Tabellenstrukturen aktualisieren könnte, die Daten beibehalten, wo es möglich ist. Aber ich möchte nicht wirklich ein kommerzielles Produkt oder einen Code-Generator verwenden, weil ich die Code-Generierung im Allgemeinen nicht mag, und ich brauche das nicht genug, dass ich darüber nachdenken würde, dafür zu bezahlen. Also hoffentlich würde jede Antwort diese Vorbehalte berücksichtigen.

Antwort

64

Das SchemaUpdate Objekt stellt Datenbank-Schema Aktualisierung, die durch scheinbar zu erzeugen und eine Reihe von SQL UPDATE Anweisungen (sowie Constraint-Anweisungen) ausgeführt wird, wenn es void Execute(bool script, bool doUpdate) Funktion aufgerufen wird. Die SchemaUpdate-Klasse befindet sich in dem Namespace NHibernate.Tool.hbm2ddl, der in der Nhibernate.dll-Datei gefunden werden kann.

SchemaUpdate wird in Kapitel 15 des nhibernate 1.0.2 toolset Führungs, here (Abschnitt 15.1.5) erwähnt.

„Die NHibernate FAQ“ hatte (Link jetzt abgelaufen) ein vollständigeres Beispiel dafür, wie SchemaUpdate verwenden:

[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

wir die Einstellung des Feldes einmal zum Beispiel erstellt nicht ändern können Stringlänge von nvarchar ändern (255) zu nvarchar (45), können wir? –

+0

Das ist eine gute Frage, die create-Version von hbm2ddl würde dies ermöglichen, aber ich habe bemerkt, dass ich manchmal die Tabellen löschen muss, bevor die Erstellung erfolgreich ausgeführt wird. –

+0

Das funktioniert hervorragend, diese Technik ist auch für Fluent NHibernate geeignet. – Contango