2010-03-20 22 views
12

Tôi thành công nhận thành thạo NHibernate để cập nhật cơ sở dữ liệu của tôi bằng cách UpdateBaseFiles gọi:Làm thành thạo NHibernate update schema đầu ra để nộp

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 

Làm thế nào để đầu ra DDL vào một tập tin, tôi làm điều này khi bước đầu tạo schema bằng cách sử dụng:

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

nhưng SchemaUpdate không có phương thức SetOutputFile.

Trả lời

11

SchemaUpdate có quá tải chấp nhận một đại biểu Action<string> mà bạn có thể cung cấp để xuất tập lệnh. Dưới đây là ví dụ trong 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); 

Tôi nghĩ điều đó sẽ hiệu quả. Tôi không thể kiểm tra nó vì SchemaUpdate là not working with SQLCE.

+0

Tôi chắc chắn điều này sẽ làm việc trong C#, nhưng tôi gặp khó khăn khi dịch các mẫu đại biểu vào VB, bất kỳ ý tưởng? – Bender

+0

Tôi không chắc chắn bạn có thể, xem http://stackoverflow.com/questions/892021/actionof-t-in-visual-basic-in-listof-t-foreach. –

+6

Điều này sẽ không hoạt động tốt bởi vì các đại biểu hành động được gọi trong mỗi tuyên bố ddl, do đó, chỉ người cuối cùng sẽ được ghi vào tập tin. Bạn có thể sử dụng filemode.append hoặc di chuyển việc tạo luồng phim bên ngoài ủy nhiệm tác vụ. – Jokin

9

SchemaUpdate gọi hành động cho mỗi lần cập nhật nó, do đó bạn không muốn trở thành tái tạo (và do đó ghi đè) cùng tập tin trên mỗi lệnh như trên, đây là những gì được yêu cầu:

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ác vấn đề liên quan