模型更改时,EF6 Code First删除表(不是整个数据库)

时间:2014-06-13 15:41:27

标签: c# entity-framework ef-migrations

我正在使用数据库迁移对Entity Framework 6进行Code First开发,并且我正在使用填充了样本种子数据的新数据库。我希望每次更改模型时都能使用种子数据初始化我的数据库。

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

有没有一种方法可以我以编程方式删除所有表格,或者我每次都手动将其从数据库中删除?

4 个答案:

答案 0 :(得分:3)

最终,我不需要删除表,只需删除它们包含的数据。

我最终只是根据this answer在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
}

答案 1 :(得分:2)

如果您没有使用自动迁移,而是使用基于代码的迁移,则可以使用以下命令将所有迁移回到第一个版本:

Update-Database –TargetMigration: 0

这将遵循所有迁移的“关闭”路径,直到您拥有干净的数据库。然后你可以执行:

Update-Database

这将使一切恢复到最新状态。此解决方案假定您已正确维护“下行”路径并使用“迁移”将数据播种。我这样做是为了我的集成测试,以确保我以预期的状态开始数据。

答案 2 :(得分:1)

我的建议是使用本地数据库或您拥有完全权限的其他数据库(Azure很好,如果您有MSDN帐户,则免费)。然后将最终的数据库模式一旦完成就可以将其移植到生产中。

话虽如此,this might be helpful,但我以前从未尝试过。

答案 3 :(得分:0)

如果您没有权限访问数据库,最好解决该问题。 无论如何:

  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;