将Fluent NHibernate输出架构更新到文件

将Fluent NHibernate输出架构更新到文件,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我正在通过调用UpdateBaseFiles成功使Fluent NHibernate更新我的数据库: Public Sub UpdateBaseFiles() Dim db As SQLiteConfiguration db = SQLiteConfiguration.Standard.UsingFile(BASE_DBNAME) Fluently.Configure() _ .Database(db) _ .Mapping

我正在通过调用UpdateBaseFiles成功使Fluent 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方法。

SchemaUpdate有一个重载,它接受一个
操作
委托,您可以提供该委托来导出脚本。下面是C#中的一个例子:

Action updateExport=x=>
{
使用(var file=newfilestream(路径、FileMode.Create、FileAccess.Append))
使用(var sw=新StreamWriter(文件))
{
sw.Write(x);
}
};
newschemaupdate(config).Execute(updateExport,false);

我想那会管用的。我无法测试它,因为SchemaUpdate是。

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

我相信这在C#中会起作用,但我在将委托模板转换为VB时遇到问题,有什么想法吗?我不确定你能不能,请看。这不会起作用,因为在每个ddl语句中都会调用动作委托,所以只会将最后一个写入文件。您可以使用filemode.append,或者将filestream创建移到操作委托之外;
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);
}