实体框架IDatabaseInitializer来重新创建DbContext的表
本文关键字:创建 DbContext 的表 新创建 框架 IDatabaseInitializer 实体 | 更新日期: 2023-09-27 18:03:02
实体框架提供很少的IDatabaseInitializers
实现。我设法实现这样的DropAndMigrateToNewest
:
public class DropAndMigrateToNewest<TContext, TMigrationsConfiguration> : IDatabaseInitializer<TContext>
where TContext : DbContext
where TMigrationsConfiguration : DbMigrationsConfiguration<TContext>, new()
{
private readonly DbMigrationsConfiguration<TContext> _configuration;
public DropAndMigrateToNewest()
{
_configuration = new TMigrationsConfiguration();
}
public void InitializeDatabase(TContext context)
{
context.Database.Delete();
var migrator = new DbMigrator(_configuration);
migrator.Update();
}
}
我现在需要的是一个初始化器,它不会删除现有的数据库(因为我们在其中构建了多个迁移模式),而是做一些在控制台使用
实现的事情。Update-Database -TargetMigration $InitialDatabase
然后是Update-Database
。
DbMigrator.Update
方法将迁移名称作为参数,但它不能与"$InitialDatabase"一起工作。我搜索了https://github.com/mono/entityframework/blob/master/src/EntityFramework/Migrations/DbMigrator.cs,但是没有任何帮助。
找到了一个解决方案:migrator.Update("0");
然后migrator.Update();
完成工作。
public class RecreateFromScratch<TContext, TMigrationsConfiguration> : IDatabaseInitializer<TContext>
where TContext : DbContext
where TMigrationsConfiguration : DbMigrationsConfiguration<TContext>, new()
{
private readonly DbMigrationsConfiguration<TContext> _configuration;
public RecreateFromScratch()
{
_configuration = new TMigrationsConfiguration();
}
public void InitializeDatabase(TContext context)
{
var migrator = new DbMigrator(_configuration);
migrator.Update("0");
migrator.Update();
}
}