2012-06-30 30 views
12

Làm thế nào để di chuyển DB mà không có nuget? Nó không thể sử dụng Visual Studio với nuget trong môi trường sản xuất. Hiện nay, nhiều ví dụ chỉ dạy chúng ta sử dụng Visual Studio với nuget. Cách sử dụng các lớp DbMigration được tạo ra?Mã EF Đầu tiên DbMigration mà không cần nuget

Trả lời

12

Cách đơn giản nhất là:

Database.SetInitializer(
    new MigrateDatabaseToLatestVersion<MyDbContext, 
             MyDbMigrationsConfiguration>()); 

này sẽ chạy di cư khi khởi tạo DbContext.

Bạn cũng có thể cưỡng chế thi hành bằng tay:

var migrator = new DbMigrator(new MyMigrationsConfiguration()); 
migrator.Update(); 

(Tôi tin rằng bạn cũng phải thiết lập TargetDatabase vào cấu hình, nhưng bạn có thể thử)

2

Bạn có thể thực hiện bằng EF Power Tools, có chương trình migrate.exe mà bạn có thể sử dụng để chạy di chuyển từ dấu nhắc lệnh (ví dụ như xây dựng bài đăng). Nếu bạn muốn chạy di trú trên cơ sở dữ liệu sản xuất, bạn cũng có thể sử dụng lệnh Update-Database để tạo các kịch bản lệnh SQL từ các lớp di trú, rất hữu ích nếu bạn cần phải trải qua một DBA.

Công cụ điện EF có sẵn trên Thư viện Visual Studio và tùy chọn here, hãy xem điều này rất hữu ích video rằng, trong số những thứ khác, nói về lệnh Update-Database.

4

Bạn có thể chuyển sang phiên bản mới nhất bằng cách sử dụng Cài đặt Web.config - xem this blog post by Rowan Miller:

Nếu bạn đang sử dụng Code First Migrations, bạn có thể định cấu hình cơ sở dữ liệu được di chuyển tự động bằng MigrateDatabaseToLatestVersion initializ er.

<contexts> 
    <context type="Blogging.BlogContext, MyAssembly"> 
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Blogging.BlogContext, 
MyAssembly], [Blogging.Migrations.Configuration, MyAssembly]], EntityFramework" /> 
    </context> 
</contexts> 

Chỉ cần trao đổi lớp ngữ cảnh của bạn ở đây: các System.Data.Entity.MigrateDatabaseToLatestVersion là built-in để EF. Cài đặt này cập nhật phiên bản AppSettings cũ của cùng một ý tưởng.

Để tâm trí của tôi là cách tốt nhất, vì câu hỏi khởi tạo để sử dụng là cấu hình thực sự, và bạn muốn có thể Web.config này, và áp dụng lý tưởng các biến đổi cấu hình để làm việc cho các môi trường khác nhau của bạn .

5

Dưới đây là các tùy chọn:

  1. Sử dụng công cụ dòng lệnh migrate.exe rằng tàu trong gói NuGet của chúng tôi.
  2. Sử dụng trình khởi chạy MigrateDatabaseToLatestVersion như những người khác đã mô tả.
  3. Sử dụng API thời gian chạy có sẵn từ lớp DbMigrator.
0

Tôi đang tìm cách kiểm soát việc di chuyển nào chạy rõ ràng trong mã mà không cần lớp DbConfiguration hoặc tự động di chuyển được bật.

Vì vậy, tôi cố gắng tạo ra tiện ích sau:

public static void RunMigration(this DbContext context, DbMigration migration) 
{    
    var prop = migration.GetType().GetProperty("Operations", BindingFlags.NonPublic | BindingFlags.Instance); 
    if (prop != null) 
    { 
     IEnumerable<MigrationOperation> operations = prop.GetValue(migration) as IEnumerable<MigrationOperation>; 
     var generator = new SqlServerMigrationSqlGenerator(); 
     var statements = generator.Generate(operations, "2008"); 
     foreach (MigrationStatement item in statements) 
      context.Database.ExecuteSqlCommand(item.Sql); 
    } 
} 

Như một ví dụ, có một sự chuyển đổi như sau:

public class CreateIndexOnContactCodeMigration : DbMigration 
{ 
    public override void Up() 
    { 
     this.CreateIndex("Contacts", "Code"); 
    } 

    public override void Down() 
    { 
     base.Down(); 
     this.DropIndex("Contacts", "Code"); 
    } 
} 

Bạn có thể chạy nó bằng cách sử DbContext của bạn:

using (var dbCrm = new CrmDbContext(connectionString)) 
{ 
    var migration = new CreateIndexOnContactCodeMigration(); 
    migration.Up();     
    dbCrm.RunMigration(migration); 
} 
1

có một giải pháp khác:

Using DB = New SHAContext() 
     If DB.Database.Exists() Then 
      Dim migrator As New DbMigrator(New SHAClassLibrary.Migrations.Configuration()) 
      For Each m In migrator.GetDatabaseMigrations() 
       Try 
        migrator.Update(m) 
       Catch ex As Exception 

       End Try 
      Next 
     End If 
     'DB.test() 
    End Using 
Các vấn đề liên quan