2010-03-20 32 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); 
}