6

Sử dụng di chuyển khung thực thể (Beta1), sử dụng lệnh Update-Database là tất cả đều tốt trong quá trình phát triển.Kích hoạt chuyển đổi EF khi khởi động ứng dụng theo mã

Nhưng khi ứng dụng đang chạy trên máy chủ của một số khách hàng ở đâu đó, tôi thực sự muốn ứng dụng của tôi tự động cập nhật lược đồ cơ sở dữ liệu của nó lên phiên bản mới nhất khi bắt đầu.

Điều này có khả thi không? Tài liệu khan hiếm.

Trả lời

11

Họ không cung cấp cách để thực hiện việc này cho đến RTM, tại thời điểm đó họ đã hứa ứng dụng dòng lệnh và nhà cung cấp dịch vụ msdeploy. Nguồn: http://blogs.msdn.com/b/adonet/archive/2011/11/29/code-first-migrations-beta-1-released.aspx

Tất nhiên không được thỏa mãn với điều đó, lệnh PowerShell được lưu trữ trong thư mục gói và là văn bản đơn giản, nó xuất hiện để chỉ tải lên một lắp ráp gọi EntityFramework.Migrations.Commands lưu trữ trong cùng thư mục.

Tracing qua lắp ráp mà tôi đã đưa ra những điều sau

public class MyContext : DbContext 
{ 
    static MyContext() 
    { 
    DbMigrationsConfiguration configuration = new DbMigrationsConfiguration() { 
     MigrationsAssembly = typeof(MyContext).Assembly, 
     ContextType = typeof(MyContext), 
     AutomaticMigrationsEnabled = true,     
    }; 

    DbMigrator dbMigrator = new DbMigrator(configuration);   
    dbMigrator.Update(null);    
    } 
} 

UPDATE: sau một chút thử nghiệm tôi đã tìm ra một vài điều hơn

  • Thực hiện một bản cập nhật trong constructor tĩnh cho bạn bối cảnh là xấu vì nó phá vỡ các lệnh powershell, tốt hơn hết việc thêm mã để khởi động ứng dụng theo cách khác (Global.asax, WebActivator hoặc phương pháp chính)
  • Mã trên chỉ hoạt động khi sử dụng AutomaticMi grations, bạn cần phải đặt MigrationsNamespace cho nó để lấy các di chuyển được tạo thủ công
  • Lớp cấu hình mà tôi tạo đã tồn tại trong dự án của bạn (được thêm vào khi bạn cài đặt gói di trú), vì vậy chỉ cần khởi tạo thay thế.

Có nghĩa là mã được đơn giản hóa để

DbMigrator dbMigrator = new DbMigrator(new NAMESPACE.TO.MIGRATIONS.Configuration()); 
dbMigrator.Update(null);   
+3

Xin lưu ý rằng hiện tại đã lỗi thời, RTM của EF 4.3 chứa bộ khởi tạo cơ sở dữ liệu mới có tên là MigrateDatabaseToLatestVersion. Xem http://stackoverflow.com/questions/9281423/entity-framework-4-3-run-migrations-at-application-start để biết thêm thông tin. – Betty

+0

Mặc dù thiết lập bộ khởi tạo trong hàm tạo ngữ cảnh dường như can thiệp vào các kịch bản lệnh PowerShell. Tôi đã hoàn nguyên về việc sử dụng mô-đun app_start với mã ở trên. – Betty

4

Một lựa chọn cho vấn đề này là thêm

Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, NAMESPACE.TO.MIGRATIONS.Configuration>()); 

dòng phương pháp Global.asaxApplication_Start của bạn.