对于Code First和EF的DBMigrations有点困惑

时间:2012-04-25 00:09:03

标签: entity-framework entity-framework-4

我创建了一个项目并启用了迁移。它用4.3创建它所以我认为它是最新的。我在执行更新的上下文的构造函数中有一些代码(请参阅下面的代码),并且每次我添加类似可空字符串列的内容或者执行不以非一致方式更改数据库的内容时,这似乎都有效。我的方案是改变我的模型,当我观察sql跟踪时,它会自动为我做改变列。

我的问题是我想做“向上”和“向下”的方法但是在运行时我们感到很困惑。也就是说我现在在版本1上,我在我的“up”方法中添加了一些代码来添加一个列,然后当我想要转到版本3时,它如何知道要调用哪个“up”方法? / p>

混淆。 -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);
        }
    }

1 个答案:

答案 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");