2013-08-26 31 views
5

Tôi muốn có thể lên phương pháp Up() theo cách thủ công. Hiện tại tôi đang cố gắng để làm điều đó nhưng gọi đó có chứa phương thức CreateTable không tạo ra bảng. Tôi nghi ngờ rằng kết nối không được thiết lập đúng. Và không có thuộc tính nào để thiết lập nó.Gọi theo cách thủ công DbMigration.Up trong EF

Tôi cũng đã thử DbMigrator nhưng nó gọi một số phương pháp di trú EF nội bộ.

Vì vậy, có ai biết cách đặt kết nối sẽ được sử dụng bởi phương pháp DbMigration.Up không?

Cảm ơn trước!

+1

Entity Framework là mã nguồn mở, vì vậy bạn có thể nhìn vào mã nguồn để tìm ra chính xác những gì họ đang làm để làm cho việc di chuyển diễn ra. http://entityframework.codeplex.com/SourceControl/latest –

+0

Cảm ơn mẹo. Đáng tiếc là tôi không thể tìm ra giải pháp. Có vẻ như tôi đang cố gắng làm những gì tôi không phải làm. Quản lý để giải quyết vấn đề theo cách khác. –

Trả lời

4

Đối với kiểm soát hoàn toàn thủ công qua di cư, bạn có thể sử dụng phương pháp mở rộng 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); 
    } 
} 

Ví dụ: Có một sự chuyển đổi như thế này:

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ó chống lại DbContext của bạn:

using (var dbCrm = new CrmDbContext(connectionString)) 
{ 
    var migration = new CreateIndexOnContactCodeMigration(); 
    migration.Up(); // or migration.Down();     
    dbCrm.RunMigration(migration); 
} 
5

tôi sử dụng đoạn mã sau để rõ ràng có thể nâng cấp cơ sở dữ liệu của tôi trong trường hợp Application_Start:

var config = new MyDatabaseMigrationsConfiguration(); 
var migrator = new System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator(new System.Data.Entity.Migrations.DbMigrator(config), new MyCommonMigrationsLogger()); 
if (migrator.GetPendingMigrations().Any()) 
{ 
    migrator.Update(); 
} 

Như xa như tôi biết điều này sẽ sử dụng mặc định (tên) ConnectionString từ DatabaseContext tôi áp dụng đang chờ giải quyết thay đổi.

  • Bạn có thể chỉ định TargetMigration trong migrator.Update() nếu bạn muốn trở thành rõ ràng
  • Các MyCommonMigrationsLogger chỉ là một thực hiện Logging.Common đơn giản cho System.Data.Entity.Migrations.Infrastructure.MigrationsLogger
+0

Tôi đã thử điều này nhưng nó không phải là những gì tôi đang tìm kiếm. Tôi muốn để có thể làm như sau trong initializer của tôi: 'Migrations.MigrationV103 migration = new Migrations.MigrationV103(); migration.Up(); ' –

+0

Có thể không phải là những gì OP là sau, nhưng dòng di chuyển đăng nhập mã là tuyệt vời! Cảm ơn bạn cho đoạn mã đó. Bây giờ tôi có thể đăng nhập di chuyển có lập trình. – BenSwayne

Các vấn đề liên quan