2010-03-20 33 views
12

我成功地獲得功能NHibernate通過調用UpdateBaseFiles更新我的數據庫:使功能NHibernate輸出架構更新到文件

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 

我如何輸出的DDL到文件,當我這樣做最初創建模式通過使用:

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

但SchemaUpdate沒有SetOutputFile方法。

回答

11

SchemaUpdate有一個超負荷接受您可以提供的Action<string>委託來導出腳本。這裏是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); 

我認爲這將起作用。我無法測試它,因爲SchemaUpdate是not working with SQLCE

+0

我當然,這將在C#中工作,但我有麻煩的代表模板轉換爲VB,任何想法? – Bender 2010-03-21 14:12:13

+0

我不確定你可以看到http://stackoverflow.com/questions/892021/actionof-t-in-visual-basic-in-listof-t-foreach。 – 2010-03-23 12:13:39

+6

這將無法正常工作,因爲操作委託會在每個ddl語句中被調用,所以最後一個將被寫入該文件。您可以使用filemode.append,或將文件流創建移到操作委託之外。 – Jokin 2011-06-22 18:36:08

9

SchemaUpdate要求每次這樣做,你不希望重現(並因此覆蓋)同一文件如上述每個命令更新的動作,這是需要什麼:

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