2012-04-25 128 views
0

對DBMigrations有點困惑我有一個項目,我創建並啓用了Migrations。它用4.3創建的,所以我認爲它是最新的。我在執行更新的上下文的構造函數中有一些代碼(請參閱下面的代碼),並且每次添加類似可空字符串列的東西時都會工作,或者做一些不會以非一致方式更改數據庫的東西。我的場景是我改變了我的模型,當我觀察sql trace時,它會自動爲我執行alter列。使用Code First和EF

我的問題是我想要做的「向上」和「向下」的方法,但我在運行時間上的困惑。也就是說,我現在在版本1上,我在「up」方法中添加了一些代碼來添加一個列,然後稍後當我想要版本3時,它如何知道要調用哪個「up」方法?

困惑。 -Peter

namespace MigrationsAutomaticDemo.Migrations 
{ 
using System.Data.Entity.Migrations; 

public partial class AddBlogRating : DbMigration 
{ 
    public override void Up() 
    { 
     AddColumn("Blogs", "Rating", c => c.Int(nullable: false, defaultValue: 3)); 
    } 

    public override void Down() 
    { 
     DropColumn("Blogs", "Rating"); 
    } 
} 
} 

public SiteDB() 
    { 
     UpdateDatabase(); 
    } 

    // http://joshmouch.wordpress.com/2012/04/22/entity-framework-code-first-migrations-executing-migrations-using-code-not-powershell-commands/ 
    public static int IsMigrating = 0; 
    private static void UpdateDatabase() 
    { 
     if (0 == Interlocked.Exchange(ref IsMigrating, 1)) 
     { 
      // Manually creating configuration: 
      var migratorConfig = new DbMigrationsConfiguration<SiteDB>(); 
      migratorConfig.AutomaticMigrationsEnabled = true; 

      // Using configuration defined in project: 
      //var migratorConfig = new DbMigrationsConfiguration(); 

      // 3 
      //var dbMigrator = new DbMigrator(new Settings()); 
      var dbMigrator = new DbMigrator(migratorConfig); 
      dbMigrator.Update(); 

      Interlocked.Exchange(ref IsMigrating, 0); 
     } 
    } 

回答

0

如果您能夠在遷移配置自動遷移,那麼你並不需要指定目標的遷移。遷移者將根據當前上下文和目標數據庫的快照自動對這些更改進行支撐。

var migratorConfig = new DbMigrationsConfiguration<SiteDB>(); 
migratorConfig.AutomaticMigrationsEnabled = true; 

對於您的情況,您希望通過使用特定遷移來升級數據庫。您所需要做的就是明確提及要升級哪個遷移。

Configuration configuration = new Configuration(); 
DbMigrator migrator = new DbMigrator(configuration); 
migrator.Update("201204250656061_AddBlogRatingVersion2"); 
migrator.Update("201204250656061_AddBlogRatingVersion3"); 
migrator.Update("201204250656061_AddBlogRatingVersionX"); 
+0

我還是沒有看到我爲每一步放置不同的UP和DOWN的位置。也就是說,我可能需要在每個步驟上執行我自己的SQL以使遷移工作。比如設置外鍵以正確填寫已填充數據的值。 – 2012-04-25 14:15:10

+0

嗨,彼得,你需要爲每一步生成每個遷移。 例如: 的201204250656061_AddBlogRatingVersion2是添加評分和VisitCount柱。 201204250656061_AddBlogRatingVersion3用於添加LastVisited和LastUpdated列。 遷移目標是受刀具[包管理控制檯]生成的ID(http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code- based-migrations-walkthrough.aspx) – 2012-04-26 03:29:11

+0

對不起,我很困惑,但我仍然感到困惑。如果有更新無法自動生成,那麼我該如何對這些更新進行編碼,以使它們能夠保持某個版本的升級或版本降低?另外,你是否必須爲此使用包管理器? – 2012-04-26 07:23:30