2010-03-20 19 views
12

sto ottenendo con successo Fluent NHibernate per aggiornare il mio database UpdateBaseFiles chiamata:Fai Fluent NHibernate aggiornamento dello schema di output su file

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 

Come posso riprodurre il DDL in un file, faccio questo quando inizialmente la creazione dello schema utilizzando:

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

ma SchemaUpdate non ha un metodo SetOutputFile.

risposta

11

SchemaUpdate ha un sovraccarico che accetta un delegato Action<string> che è possibile fornire per esportare lo script. Ecco un esempio 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); 

Penso che funzionerà. Non è stato possibile testarlo perché SchemaUpdate è not working with SQLCE.

+0

Sono sicuro che ciò funzionerebbe in C#, ma ho problemi a tradurre il modello delegato in VB, qualche idea? – Bender

+0

Non sono sicuro che sia possibile, vedere http://stackoverflow.com/questions/892021/actionof-t-in-visual-basic-in-listof-t-foreach. –

+6

Questo non funzionerà bene perché il delegato dell'azione viene chiamato in ogni istruzione ddl, quindi solo l'ultimo verrà scritto sul file. È possibile utilizzare filemode.append o spostare la creazione del flusso di file al di fuori del delegato dell'azione. – Jokin

9

SchemaUpdate chiama l'azione per ogni aggiornamento lo fa in modo da non vuole essere ricreare (e quindi sovrascrivere) lo stesso file su ogni comando come sopra, questo è ciò che è necessario:

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); 
} 
Problemi correlati