Trả lời

50

Cách tốt nhất nên sử dụng trình khởi chạy MigrateDatabaseToLatestVersion mới.

Database.SetInitializer<YourContext>(
    new MigrateDatabaseToLatestVersion<YourContext, YourMigrationsConfig>()); 
Database.Initialize(false); 
+4

Mã này dự định được đặt ở đâu? Người ta không thể sử dụng Database.Initialize trong App_Start vì nó không thể được sử dụng trong một bối cảnh tĩnh. –

+0

@ MaximV.Pavlov: Hãy thử thêm nó vào hàm tạo tĩnh trong ngữ cảnh của bạn. –

+0

@LadislavMrnka: mục đích của 'Database.Initialize (false);' là gì? Từ thử nghiệm của tôi với 'MigrateDatabaseToLatestVersion', cơ sở dữ liệu được tạo, gieo và cập nhật lên phiên bản mới nhất mà không có lệnh Initialize thứ hai. (trong EF5 ...) – demoncodemonkey

6

Một mô tả tuyệt vời về tùy chọn cấu hình EF 4.3 có thể tìm thấy tại EF 4.3 Configuration File Settings trên blog của nhóm ADO.NET. Phần cuối cùng mô tả Khởi tạo cơ sở dữ liệu, bao gồm bộ khởi tạo mã đầu tiên MigrateDatabaseToLatestVersion mới.

Mặc dù Entity Framework — giống như nhiều tính năng khác của .NET 4.x — ưu tiên cấu hình, đây là một trường hợp rất hữu ích để đặt bộ khởi tạo cơ sở dữ liệu MigrateDatabaseToLatestVersion thông qua tệp cấu hình của ứng dụng chứ không phải mã rõ ràng nó vào ứng dụng của bạn.

+0

Khi sử dụng cấu hình, cũng lưu ý nhận xét của tôi về bài đăng đó, để làm cho cấu hình dễ đọc hơn nhiều. – Rudi

4

Tôi cần làm điều đó một cách rõ ràng, vì tôi sử dụng ngữ cảnh uber để di chuyển, một phần lớn các di chuyển khác. Các bit chính là:

var dbMigrator = new System.Data.Entity.Migrations.DbMigrator(
    new Lcmp.EF.Migrations.Migrations.Configuration()); 
dbMigrator.Update(); 

Với một sprinkling của Elmah đăng nhập, tôi thực sự sử dụng này, được gọi là từ Application_Start(). Các mảnh của nó bị đánh cắp từ ý tưởng của người khác. Tôi không tích cực là phần khóa an toàn chỉ là cần thiết.

public static int IsMigrating = 0; 
private static void UpdateDatabase() 
{ 
    try 
    { 
     if (0 == System.Threading.Interlocked.Exchange(ref IsMigrating, 1)) 
     { 
      try 
      { 
       // Automatically migrate database to catch up. 
       Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("Checking db for pending migrations."))); 
       var dbMigrator = new System.Data.Entity.Migrations.DbMigrator(new Lcmp.EF.Migrations.Migrations.Configuration()); 
       var pendingMigrations = string.Join(", ", dbMigrator.GetPendingMigrations().ToArray()); 
       Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("The database needs these code updates: " + pendingMigrations))); 
       dbMigrator.Update(); 
       Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("Done upgrading database."))); 
      } 
      finally 
      { 
       System.Threading.Interlocked.Exchange(ref IsMigrating, 0); 
      } 
     } 
    } 
    catch (System.Data.Entity.Migrations.Infrastructure.AutomaticDataLossException ex) 
    { 
     Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(ex)); 
    } 
    catch (Exception ex) 
    { 
     Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(ex)); 
    } 
} 
Các vấn đề liên quan