实体框架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,但是没有任何帮助。

实体框架IDatabaseInitializer来重新创建DbContext的表

找到了一个解决方案: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();
    }
}