当模型改变时,首先删除表(不是整个数据库)
本文关键字:数据库 删除 改变 模型 | 更新日期: 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;