2010-03-20 3 views
12

ich erfolgreich bin immer Fluent NHibernate meine Datenbank durch Aufruf UpdateBaseFiles zu aktualisieren:Fluent NHibernate Ausgabeschema Update-Datei

Public Sub UpdateBaseFiles() 
    Dim db As SQLiteConfiguration 
    db = SQLiteConfiguration.Standard.UsingFile(BASE_DBNAME) 
    Fluently.Configure() _ 
      .Database(db) _ 
      .Mappings(Function(m) m.FluentMappings.AddFromAssemblyOf(Of FluentMap)()) _ 
      .ExposeConfiguration(AddressOf UpdateSchema) _ 
      .BuildConfiguration() 
End Sub 
Private Sub UpdateSchema(ByVal Config As Configuration) 
    Dim SchemaUpdater As New SchemaUpdate(Config) 
    SchemaUpdater.Execute(True, True) 
End Sub 

Wie Ausgabe ich die DDL in einer Datei, das tue ich dies, wenn zunächst das Schema zu schaffen mit:

Private Sub BuildSchema(ByVal Config As Configuration) 
    Dim SchemaExporter As New SchemaExport(Config) 
    SchemaExporter.SetOutputFile("schema.sql") 
    SchemaExporter.Create(False, True) 
End Sub 

aber SchemaUpdate hat keine SetOutputFile-Methode.

Antwort

11

SchemaUpdate hat eine Überladung, die einen Action<string> Delegaten akzeptiert, den Sie bereitstellen können, um das Skript zu exportieren. Hier ist ein Beispiel in C#:

Action<string> updateExport = x => 
    { 
     using (var file = new FileStream(path, FileMode.Create, FileAccess.Append)) 
     using (var sw = new StreamWriter(file)) 
     { 
      sw.Write(x); 
     } 
    }; 
new SchemaUpdate(config).Execute(updateExport, false); 

Ich denke, das wird funktionieren. Ich konnte es nicht testen, da SchemaUpdate not working with SQLCE ist.

+0

Ich bin Sicher, das würde in C# funktionieren, aber ich habe Probleme beim Übersetzen der Delegat Vorlage in VB, irgendwelche Ideen? – Bender

+0

Ich bin mir nicht sicher, ob Sie können http://stackoverflow.com/questions/892021/actionof-t-in-visual-basic-in-listof-t-foreach. –

+6

Dies funktioniert nicht, da der Aktionsdelegat in jeder ddl-Anweisung aufgerufen wird, sodass nur der letzte in die Datei geschrieben wird. Sie können filemode.append verwenden oder die Dateistream-Erstellung außerhalb des Aktionsdelegaten verschieben. – Jokin

9

SchemaUpdate die Aktion für jedes Update nennt es tut, so dass Sie nicht wollen, wie oben sein, neu zu erstellen (und daher überschreibt) die gleiche Datei auf jeden Befehl, das ist, was erforderlich ist:

using (var file = new FileStream(@"..\..\..\schema-update.sql", 
     FileMode.Create, 
     FileAccess.ReadWrite)) 
using (var sw = new StreamWriter(file)) 
{ 
    new SchemaUpdate(config) 
     .Execute(sw.Write, false); 
}