2016-11-28 56 views
0

我手动创建一个类如何手动(通过代码)应用手工制作的DbMigration?

public class AddClientsTable : DbMigration, IMigrationMetadata 
    { 

    string IMigrationMetadata.Id 
    { 
     get { return "201611281757258_AddClientsTable"; } 
    } 

    string IMigrationMetadata.Source 
    { 
     get { return null; } 
    } 

    string IMigrationMetadata.Target 
    { 
     get { return "AddClientsTable-Migration"; } 
    } 

    public override void Up() { 
     CreateTable("Clients", t => new { 
      ClientId = t.Guid(name:"ClientId"), 
      Name = t.String() 
      }) 
     .PrimaryKey(t => t.ClientId, "ClientId") 
     .Index(t => t.ClientId, "PK_Clients", true); 
    } 

    public override void Down() { 
     DropIndex("Clients", "PK_Clients"); 
     DropTable("Clients"); 
    } 

    } 

,我想通过代码优先迁移从代码应用这样的:

 var migration = new AddClientsTable(); 
     migration.Up(); 
     context.RunMigration(migration); 

这是我从here偷走了,但是当我运行的代码我得到这个例外:

Unable to cast object of type 'System.Data.Entity.Migrations.Model.CreateIndexOperation' to type 'System.Data.Entity.Migrations.Model.HistoryOperation'. 

HistoryOperation是操作w更新__MigrationHistory表?所以我如何通过代码来做到这一点?

我缺少的东西或EntityFrameowrk Update-Database命令确实比我知道的更多?

+0

为什么你正试图通过代码再次做到这一点? – Dispersia

+0

好吧,我不使用Visual Studio(在我的旧机器上运行得太慢)来执行Update-Database命令,我只是使用gvim进行代码编辑,我真的希望能够像Code-First Databse Migration一样那。 – Abdelghani

+0

你有没有powershell?对于实体框架 – Dispersia

回答

0

这是没有意义的樱桃采摘迁移并运行它,因为迁移是累积的,必须按顺序运行。因此,您最好在应用程序启动时运行相当于update-database powershell的命令。

下面是一些代码,我们用它来做到这一点:

Configuration.cs类的构造函数

AutomaticMigrationsEnabled = false; 
AutomaticMigrationDataLossAllowed = false; 

然后在应用程序启动时调用下面的方法(当你enable-migrations这个文件发):

public static void ApplyDatabaseMigrations() 
{ 
    //Configuration is the class created by Enable-Migrations 
    DbMigrationsConfiguration dbMgConfig = new Configuration() 
    { 
     ContextType = typeof(MyDbContext) //+++++CHANGE ME+++++ 
    }; 
    using (var databaseContext = new MyDbContext()) //+++++CHANGE ME+++++ 
    { 
     try 
     { 
      var database = databaseContext.Database; 
      var migrationConfiguration = dbMgConfig; 
      migrationConfiguration.TargetDatabase = 
       new DbConnectionInfo(database.Connection.ConnectionString, 
            "System.Data.SqlClient"); 
      var migrator = new DbMigrator(migrationConfiguration); 
      migrator.Update(); 
     } 
     catch (AutomaticDataLossException adle) 
     { 
      dbMgConfig.AutomaticMigrationDataLossAllowed = true; 
      var mg = new DbMigrator(dbMgConfig); 
      var scriptor = new MigratorScriptingDecorator(mg); 
      string script = scriptor.ScriptUpdate(null, null); 
      throw new Exception(adle.Message + " : " + script); 
     } 
    } 
} 
+0

尝试了解决方案,但遇到了另一个问题, 'string IMigrationMetadata.Target { get {return“AddClientsTable-Migration”; } }' 该字段需要是模型(?)的'Base64',我如何从代码或PowerShell生成它?我正在考虑使用命令行中的powershell来生成迁移并使用yoyr snipppet代码应用它们。 – Abdelghani

+0

@Abdelghani这是'Add-Migration'命令的用处。祝你好运导航没有它的迁移。 – spender