从种子方法删除并创建数据库?

时间:2013-11-24 19:55:55

标签: c# sql-server entity-framework entity-framework-5

每次执行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
}

注意:使用原始查询截断不起作用,关系太多。
注意:删除所有对象是个坏主意,对象太多了。

3 个答案:

答案 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?

http://softwaremechanik.wordpress.com/2013/11/04/ef6-if-migrations-are-enabled-cannot-createdatabaseifnotexists/

答案 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();
            }
        }             
    }