实体框架:在所有迁移之前运行代码

And*_*kin 5 .net c# entity-framework database-migration entity-framework-migrations

我想迁移数据库中的存储过程和视图。由于我总是迁移到最新版本,因此一种源代码控制友好的方法是在迁移过程中删除/重新创建所有过程/视图(使用这种方法,每个过程有一个文件,而不是每个版本一个)。

由于旧的过程/函数/视图可能与新的架构更改不兼容,我想在所有迁移之前进行删除,然后再进行创建。

以前我使用了定制的 FluentMigrator,但现在我正在研究实体框架代码优先迁移。我看到我可以用来Seed在所有迁移后始终运行代码。

有什么我可以用来所有迁移之前始终运行代码的东西吗?

khe*_*ang 2

如果您希望在迁移开始之前运行一些代码,您可以指定自定义数据库初始值设定项:

public class AwesomeEntity
{
    public int Id { get; set; }
}

public class AwesomeDbContext : DbContext
{
    static AwesomeDbContext()
    {
        Database.SetInitializer(new AwesomeDatabaseInitializer());
    }

    public IDbSet<AwesomeEntity> Entities { get; set; }
}

public class AwesomeDatabaseInitializer : MigrateDatabaseToLatestVersion<AwesomeDbContext, AwesomeMigrationsConfiguration>
{
    public override void InitializeDatabase(AwesomeDbContext context)
    {
        // TODO: Run code before migration here...

        base.InitializeDatabase(context);
    }
}

public class AwesomeMigrationsConfiguration : DbMigrationsConfiguration<AwesomeDbContext>
{
    public AwesomeMigrationsConfiguration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(AwesomeDbContext context)
    {
        // TODO: Seed database here...
    }
}
Run Code Online (Sandbox Code Playgroud)

这将自定义初始值设定项设置为自定义AwesomeDatabaseInitializer,它继承自MigrateDatabaseToLatestVersion. 如果您想每次删除并重建数据库,则应该使用 作为DropCreateDatabaseAlways基类,尽管我不确定这是否允许您运行迁移。

在初始化程序中,您可以重写该InitializeDatabase方法,您可以在调用之前运行代码base.InitializeDatabase,这将触发数据库初始化,进而触发Seed迁移配置的方法AwesomeMigrationsConfiguration

这是使用 EF6。我不确定实体框架的早期版本中是否有等效项。