我的代码首次迁移出了什么问题?

时间:2016-07-03 07:46:29

标签: ef-code-first ef-migrations

这是我的迁移和种子代码:

internal sealed class Configuration : DbMigrationsConfiguration<AuthDb>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            ContextKey = "Service.DAL.AuthDb";
        }

    }
public class CreateOrRunMigrations: CreateDatabaseIfNotExists<AuthDb>
    {
        public override void InitializeDatabase(AuthDb context)
        {
            base.InitializeDatabase(context);
            var migrator = new DbMigrator(new Migrations.Configuration());
            migrator.Update();

        }

        protected override void Seed(AuthDb context)
        {
            base.Seed(context);

            // add Default product and company

        }

    }

上下文以这种方式构建

public class AuthDb : DbContext
    {
        public AuthDb() : base("name=xxx")
        {
            Database.SetInitializer(new CreateOrRunMigrations());
            Configuration.LazyLoadingEnabled = false;
            Configuration.ProxyCreationEnabled = false;            
            Configuration.AutoDetectChangesEnabled = true;
        }
   }

我想要的是:

  1. 首次创建数据库时,会添加种子数据。

  2. 当我在模型中进行更改时,迁移代码会自动将更改应用于数据库。

  3. 当我进行更改(例如公司)并使用update_database在控制台中添加迁移时,会创建迁移文件。但是当代码运行时,我收到一个错误,抱怨我的模型和数据库不再匹配。

    当然它不匹配,因为我刚刚进行了更改,我希望迁移将应用更改。但事实并非如此。我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的初始化程序派生自CreateDatabaseIfNotExists,因此它只在数据库不存在时才会运行。尝试从MigrateDatabaseToLatestVersion派生它:

public class CreateOrRunMigrations: MigrateDatabaseToLatestVersion<AuthDb>
{

    // no need for InitializeDatabase override since that's what this initializer does...

    protected override void Seed(AuthDb context)
    {
        base.Seed(context);

        // add Default product and company

    }

}