其他分享
首页 > 其他分享> > 实体框架:在所有迁移之前运行代码

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

作者:互联网

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

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

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

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

解决方法:

如果要在迁移开始之前运行一些代码,则可以指定一个自定义数据库初始化程序:

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...
    }
}

这会将自定义初始化程序设置为自MigrateDatabaseToLatestVersion继承的自定义AwesomeDatabaseInitializer.如果您想每次都删除并重建数据库,则应该使用DropCreateDatabaseAlways作为基类,尽管我不确定这是否可以运行迁移.

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

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

标签:ef-migrations,database-migration,c,net,entity-framework
来源: https://codeday.me/bug/20191029/1958298.html