每次执行update-database -v -f
时,我都希望完全删除数据库,然后再将其设置为空。有可能吗?
我尝试删除它然后创建它但它不起作用。奇怪的是,我在EF4中做了完全相同的事情并确实有效,但现在却没有。
那么如何使用某个命令重新创建数据库呢?
为上下文'MainDataContext'启用了迁移,但数据库不存在或不包含映射表。使用迁移创建数据库及其表,例如通过从程序包管理器控制台运行“Update-Database”命令。
这是我的种子方法
protected override void Seed(Api.Models.MainDataContext context)
{
context.Database.Delete();
context.Database.Create();
// context.Database.Initialize(true); Also tried this but same result
}
注意:使用原始查询截断不起作用,关系太多。
注意:删除所有对象是个坏主意,对象太多了。
答案 0 :(得分:1)
您是否可以首先运行Update-Database:
Update-Database -TargetMigration:0
这会将所有迁移回滚到零。然后再次运行Update-Database。
编辑:种子方法不应该对数据库结构做任何事情,它应该只修改数据。应该使用迁移。
Edit2:我找不到有关使用Update-Database删除数据库的信息,它只会在第一次迁移之前回滚,你似乎没有。 只有在通过代码部署它时,您才能使用DropCreateDatabaseAlways策略,如下所示:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-first.aspx 如果要手动执行迁移,则可能必须在运行Update-Database之前手动删除数据库。
答案 1 :(得分:0)
您想在模型更改时删除并重新创建数据库吗?怎么样......
Database.SetInitializer(new DropCreateDatabaseIfModelChanges());
您说得对,EF6改变了迁移的处理方式。
您必须删除迁移文件夹及其中的所有类。
@cederlof对update-database是正确的:没有drop database开关或create database switch。创建EF6数据库的唯一wan(AFAIK!)是做新的CloudMinderDataContext(someconnectionstring)
我遇到了问题,因为我希望迁移更新我的登台数据库,但无法在代码中创建新的数据库。这在EF4中很好,但在EF6中没有。我不得不使用SQL来创建数据库,然后迁移它......
How do I generate an EF6 database with migrations enabled, without using update-database?
和
答案 2 :(得分:0)
嗨Steve:要删除一个数据库,请使用此功能。如果您是集成测试,您的测试可能实际上并行运行,因此请确保在调用此数据库之前已完成此数据库...
private void DropDatabase(string connectionString)
{
var bld = new SqlConnectionStringBuilder(connectionString);
var dbName = bld.InitialCatalog; //database you want to drop
bld.InitialCatalog = "master";
var masterConnectionString = bld.ConnectionString;
using (var cnn = new SqlConnection(masterConnectionString))
{
using (var cmd = new System.Data.SqlClient.SqlCommand())
{
cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = string.Format("ALTER DATABASE {0} SET SINGLE_USER WITH ROLLBACK IMMEDIATE",
dbName);
cmd.ExecuteNonQuery();
cmd.CommandText = string.Format("DROP DATABASE {0}",
dbName);
cmd.ExecuteNonQuery();
}
}
}