实体框架:在所有迁移之前运行代码
作者:互联网
我想在数据库中迁移存储过程和视图.由于我总是迁移到最新版本,因此,一种源代码控制友好的方法是在迁移过程中删除/重新创建所有过程/视图(使用这种方法,每个过程只有一个文件,而不是每个版本一个).
由于旧的过程/功能/视图可能与新的架构更改不兼容,因此我想在所有迁移之前删除,然后再进行创建.
以前我使用了自定义的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