当模型改变时,首先删除表(不是整个数据库)

本文关键字:数据库 删除 改变 模型 | 更新日期: 2023-09-27 18:08:44

我正在使用实体框架6进行代码优先开发,使用数据库迁移,并且我正在使用一个填充了示例种子数据的新数据库。我希望能够初始化我的数据库与种子数据任何时候我改变模型。

问题是:我没有创建数据库的权限;因此,我不能只使用DropCreateDatabaseIfModelChanges。

是否有一种方法,我可以以编程方式删除我所有的表,或者我每次都手动从数据库中删除它们?

当模型改变时,首先删除表(不是整个数据库)

最后,我不需要删除表,只需要删除其中包含的数据。

我最终解决了这个问题,根据这个答案,我在Seed方法开始时简单地截断了一个表列表。

protected override void Seed(MyContext context)
{
    var listOfTables = new List<string> { "Table1", "Table2", "Table3" };
    foreach (var tableName in listOfTables)
    {
        context.Database.ExecuteSqlCommand("TRUNCATE TABLE [" + tableName + "]");
    }
    context.SaveChanges();
    // seed data below
}

如果您不使用自动迁移,而是使用基于代码的迁移,那么您可以使用以下命令返回到第一个版本:

Update-Database –TargetMigration: 0

这将在所有迁移中遵循Down路径,直到拥有一个干净的数据库。然后可以执行:

Update-Database

这将使所有内容恢复到最新状态。此解决方案假定您已经正确地维护了下行路径,并使用Migrations播种了数据。我为我的集成测试这样做,以确保我开始时数据处于预期状态。

我的建议是使用本地数据库或您拥有完全权限的其他数据库(Azure很好,如果您有MSDN帐户,则免费)。然后,一旦最终的DB模式固定下来并准备好投入生产,就迁移过来。

话虽这么说,这可能有帮助,但我以前从未尝试过。

如果您没有访问数据库的权限,最好解决这个问题。总之:

  public bool TruncateTable(string connectionString, string schema, string tableName) {
        var statement = "TRUNCATE TABLE [{0}].[{1}] ;";
        statement = string.Format(statement, schema, tableName);
        return ExecuteSqlStatement(connectionString, statement);
    }
    public bool DeleteAllEntriesTable(string connectionString, string schema, string tableName) {
        var statement = "DELETE FROM [{0}].[{1}] ;";
        statement = string.Format(statement, schema, tableName);
        return ExecuteSqlStatement(connectionString, statement);
    }
    public bool ExecuteSqlStatement(string connectionString, string statement, bool suppressErrors = false) {
        int rowsAffected;
        using (var sqlConnection = new SqlConnection(connectionString)) {
            using (var sqlCommand = new SqlCommand(statement, sqlConnection)) {
                try {
                    sqlConnection.Open();
                    rowsAffected = sqlCommand.ExecuteNonQuery(); // potential use
                }
                catch (Exception ex) {
                    if (!suppressErrors) {
                     // YOUR ERROR HANDLER HERE
                    }
                    return false;
                }
            }
        }
        return true;