我正在使用数据库迁移对Entity Framework 6进行Code First开发,并且我正在使用填充了样本种子数据的新数据库。我希望每次更改模型时都能使用种子数据初始化我的数据库。
问题是:我没有数据库创建权限;因此,我不能只使用DropCreateDatabaseIfModelChanges。
有没有一种方法可以我以编程方式删除所有表格,或者我每次都手动将其从数据库中删除?
答案 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;