以编程方式将Entity Framework数据库重置为$InitialDatabase

4
我已经使用迁移配置了Entity Framework(6.1.1)。我知道可以在Package Manager Console中运行以下命令来将数据库完全重置为空:
Update-Database –TargetMigration: $InitialDatabase

但是我如何在我的代码中实现这个功能呢?

你能解释一下这个需求背后的使用场景吗?你是想要钩入迁移系统以触发额外的行为吗?DbContext.Database.Delete(); DbContext.Database.Initialize(true);会删除并重新创建数据库,但不清楚这是否符合你的要求。 - Gusdor
@Gusdor:为了避免大量的迁移,我每个版本发布都有一个迁移。由于我要进入 alpha 测试阶段,第一个 alpha 版本后可能会在版本化迁移中添加一些内容。当我发布下一个 alpha 版本(或 beta 版本)时,已经应用的版本化迁移可能会发生变化,因此我必须将数据库重置为 $InitialDatabase,否则迁移不会应用,因为 EF 认为它已经应用,但表和迁移之间存在不匹配。 - GTHvidsten
@GTHvidsten,我的方法解决了你的问题吗? - Bassam Alugili
@BassamAlugili 我明天早上第一时间会查看。 - GTHvidsten
1个回答

3
        var configuration = new MyDbConfiguration();
        configuration.TargetDatabase = new DbConnectionInfo(
            "Server=MyServer;Database=MyDatabase;Trusted_Connection=True;",
            "System.Data.SqlClient");

        var migrator = new DbMigrator(configuration);
        migrator.Update("201606030938116_InitialDatabase");

如果您不知道迁移ID,那么可以执行以下操作:

    migrator.GetDatabaseMigrations().First();

或者:
    migrator.GetLocalMigrations().First();

在您的DbConfiguration中,您需要允许自动删除:
public class MyDbConfiguration: DbMigrationsConfiguration<MyDbContext>
  {
    public MyDbConfiguration()
    {
      this.AutomaticMigrationsEnabled = true;
      this.AutomaticMigrationDataLossAllowed = true;
    }
  }

@GTHvidsten更新:

不是获取可用的迁移,而是使用这个命令:migrator.Update(DbMigrator.InitialDatabase);。但你也必须设置MyDbConfiguration中的ContextKey属性,以匹配包管理器创建的Configuration对象中使用的属性。同时满足这两个条件后,我的数据库变为空。


我无法使这个工作。它可以找到迁移,但当我尝试执行migrator.Update(migrator.GetLocalMigrations().First())时,会出现错误,指出“数据库中已经存在名为'SomeTable'的对象”。原始迁移配置对象(通过软件包管理器创建)已经为 ContextKey 属性设置了一个值。我尝试在 MyDbConfiguration 中设置相同的值。这样可以消除错误,但在 Update() 调用时什么也不会发生。数据库与之前完全相同。 - GTHvidsten
好的,我认为我已经解决了。您需要使用以下命令而不是获取可用迁移:migrator.Update(DbMigrator.InitialDatabase);。但是,您还必须将MyDbConfiguration中的ContextKey属性设置为与包管理器创建的Configuration对象中使用的属性相匹配。有了这两个条件,我的数据库就变为空了。 - GTHvidsten
好消息) 将其标记为答案。 - Bassam Alugili
我会的。也许你可以更新你的答案以反映我所发现的,这样其他人就不必阅读评论才能使其正常工作? - GTHvidsten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接