2010-03-20 8 views
12

Me estoy haciendo con éxito Fluido NHibernate para actualizar mi base de datos por UpdateBaseFiles Calling:Hacer Fluido NHibernate actualización del esquema de salida para presentar

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 

¿Cómo saco el DDL en un archivo, hago esto al crear inicialmente el esquema utilizando:

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

pero SchemaUpdate no tiene un método SetOutputFile.

Respuesta

11

SchemaUpdate tiene una sobrecarga que acepta un delegado Action<string> que puede suministrar para exportar el script. Aquí hay un ejemplo en 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); 

Creo que funcionará. No pude probarlo porque SchemaUpdate es not working with SQLCE.

+0

soy Seguro que esto funcionaría en C#, pero estoy teniendo problemas para traducir la plantilla del delegado en VB, ¿alguna idea? – Bender

+0

No estoy seguro de que pueda, consulte http://stackoverflow.com/questions/892021/actionof-t-in-visual-basic-in-listof-t-foreach. –

+6

Esto no funcionará bien porque se llama al delegado de acción en cada instrucción ddl, por lo que solo la última se escribirá en el archivo. Puede usar filemode.append o mover la creación de filestream fuera del delegado de acción. – Jokin

9

SchemaUpdate llama a la acción para cada actualización que hace por lo que no quieres estar recreando (y por lo tanto la sobreescritura) el mismo archivo en cada comando que el anterior, esto es lo que se requiere:

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