【问题标题】:How to delete and recreate from scratch an existing EF Code First database如何从头开始删除和重新创建现有的 EF Code First 数据库
【发布时间】:2013-04-08 18:10:06
【问题描述】:

我在 VS 2012 中使用 EF Code First 和 EF 5。我使用 PM update-database 命令,并且我有一个简单的种子方法来用示例数据填充一些表。

我想删除并重新创建我的 x.mdb。更新历史似乎不同步。如果我在我的上下文中注释掉我的所有 DBSet,update-database 运行时不会出现错误,但会在数据库中留下一些表。由于我在数据库中没有有价值的数据,因此重置所有内容似乎是最简单的。

我怎样才能做到这一点?

【问题讨论】:

    标签: ef-code-first entity-framework-migrations


    【解决方案1】:

    如果我理解正确的话......

    如果你想start clean

    1) 手动删除您的数据库 - 无论它在哪里(我假设您已经对连接进行了排序),或者清空它,但更容易/更安全的是一起删除它 - 因为有system __MigrationHistory table - 你也需要删除它。

    2) 删除所有migration files - 在Migrations 下 - 并命名为数字等 - 将它们全部删除,

    3) 重建您的项目 包含迁移(和其余部分) - 并确保您的项目设置(配置)以自动构建(有时可能会导致问题 - 但不太可能) ,

    4) 再次运行 Add-Migration Initial - 然后运行 ​​Update-Database

    【讨论】:

    • 所以没有命令让 ef 迁移删除数据库本身?
    • ...据我所知(不确定最新版本) - EF/迁移擅长在没有 Db 时“创建”,然后在更改代码时“更新”。但是,当您需要进行一些管理维护时,您必须亲自动手
    • 我还必须从 SQL Server 对象资源管理器中删除数据库。
    • 我必须在运行 Update-Database 之前重新启动 Visual Studio 才能使其正常工作。第一次尝试时,在生成新结构的过程中发生了错误,尽管 add-migration 没有报告任何问题。
    • @lpacheco 如果您有一个生产数据库,其中包含您不想破坏的数据,那么,我恭敬地建议一个题为“如何删除......现有的.. .database" 对你来说不是很正确的问题。
    【解决方案2】:

    如果您使用命令Add-Migration "Name_Of_Migration" 以正确的方式创建迁移,那么您可以执行以下操作来获得干净的开始(重置,丢失数据,课程):

    1. Update-database -TargetMigration:0

      由于执行了 down 方法,通常您的数据库现在是空的。

    2. Update-database

      这会将您的数据库重新创建到您当前的迁移中

    【讨论】:

    • Update-database -TargetMigration:0 需要 -f(强制)标志才能删除所有内容,否则它会说可能会丢失数据。命令应该是:Update-database -TargetMigration:0 -f
    • @Tascalator,我只是在没有 -f 的情况下尝试了这个,并且没有关于可能的数据丢失的警告。使用 EF 6.1.2,表中有数据被删除。
    • 完美答案。快捷方便!谢谢
    • 根据 EF Core Docs,正确的参数名称是 -Target(对于 EF Core 1.1)或 -Migration(对于 EF Core 2.0)
    【解决方案3】:

    对于 EntityFrameworkCore,您可以使用以下内容:

    Update-Database -Migration 0
    

    这将从数据库中删除所有迁移。 然后你可以使用:

    Remove-Migration
    

    删除您的迁移。 最后,您可以重新创建迁移并将其应用到数据库。

    Add-Migration Initialize
    Update-Database
    

    在 EFCore v2.1.0 上测试

    dotnet ef CLI 工具也是如此:

    dotnet ef database update 0 [ --context dbcontextname ]
    dotnet ef migrations add Initialize
    dotnet ef database update
    

    【讨论】:

    • 像魅力一样工作!
    • @user77232 很遗憾听到它不再适用于 .net 5。他们是否更改了您在包管理器中使用的命令?我已经有一段时间没有和 EF 合作了,所以我不确定。
    • 我的立场是正确的。它是“-Migration 0”,我认为您必须输入要恢复到的迁移的名称。它在 5 内有效!
    • @user77232 我很高兴听到它仍然有效!谢谢指正。
    • 注意:Remove-Migration 用于 EF Core;对于使用 EF 6 的项目,您必须手动删除迁移文件。
    【解决方案4】:

    从包管理器控制台删除、创建和播种的单行:

    update-database -TargetMigration:0 | update-database -force
    

    卡布姆。

    【讨论】:

    • 为什么需要两次执行相同的步骤? “更新数据库-force”我的意思是
    • 只是一个小提示:“AutomaticMigrationDataLossAllowed = true;”在配置中是必需的。
    • EF Core 中的等效语法只是 Update-Database 0。无论如何,这不适合 OP 的情况,即 “更新历史似乎不同步”;这种方法通过为迄今为止应用于数据库的每个迁移运行“向下”迁移来工作,因此如果您删除了以前应用的迁移,那么这将失败(如果您已修改,它可能同样会失败 应用后的迁移)。 accepted answer 更健壮。 -1 ,以及 update-database -force 的无法解释的重复。
    • @SwissCoder - 你不需要两次相同的步骤(至少,我没有)。我认为这是一个错字。
    • @SwissCoder 老实说我没有注意到,无意冒犯
    【解决方案5】:

    怎么样..

    static void Main(string[] args)
    {
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ExampleContext>());  
        // C
        // o
        // d
        // i
        // n
        // g
    }
    

    我从Programming Entity Framework: Code First,第 28 页第一版。

    【讨论】:

    • 这不是一个好的 ida。这段代码很有可能会进入生产环境,您最终会对您的客户感到头疼......
    • 这只会在模型更改时删除数据库,OP 想要删除它,即使没有模型更改。
    【解决方案6】:

    如果您按照本教程创建了数据库:https://msdn.microsoft.com/en-au/data/jj193542.aspx

    ...那么这可能会起作用:

    1. 删除项目目录中的所有.mdf.ldf 文件
    2. 转到查看/SQL Server 对象资源管理器并从 (localdb)\v11.0 子节点中删除数据库。另见https://stackoverflow.com/a/15832184/2279059

    【讨论】:

      【解决方案7】:

      dbctx.Database.EnsureDeleted(); dbctx.Database.EnsureCreated();

      【讨论】:

        【解决方案8】:

        删除数据库或更新现有数据库的方法有很多,只需切换到以前的迁移即可。

        dotnet ef database update previousMigraionName    
        

        但是某些数据库有限制,例如在创建关系后不允许修改,这意味着您没有权限从 ef core 数据库提供程序中删除列,但大多数时间在 ef core drop 数据库中是允许的。所以您可以使用 drop 删除数据库命令 然后你再次使用之前的迁移。

        dotnet ef database drop
        PMC command 
        PM> drop-database
        

        或者您可以手动删除数据库并进行迁移。

        【讨论】:

          【解决方案9】:

          将 EF6 与 ASP.Net Core 5 结合使用,我发现这些命令在第一次初始化数据库时很方便:

          Remove-Migration -force; Add-Migration InitialMigration; Update-Database;
          

          它删除最后一次迁移(应该是唯一的),再次创建它,然后刷新数据库。因此,您可以在编辑DbContext 后将这三个命令在一行中输入Package Management Console,它将更新InitialMigration 和数据库。

          有点烦人的是它会连续编译你的项目三次,但至少不需要进一步的手动步骤(如删除迁移文件)。


          当您删除实体时,您需要在更新之前发出Remove-Database。所以这条线变成了:

          Remove-Migration -force; Add-Migration InitialMigration; Remove-Database; Update-Database;
          

          这里有问题:您需要确认删除数据库 + 4 次重建。

          【讨论】:

            【解决方案10】:

            采取以下步骤:

            1. 删除那些应该从上下文中删除的对象 // Dbset&lt;Item&gt; Items{get;set;} 并在 Nuget 控制台中运行这些命令
            2. 添加迁移 [contextName]
            3. 更新数据库-详细

            它将删除上下文中不存在但已在数据库中创建的表

            【讨论】:

              【解决方案11】:

              让我在这里帮助更新答案,因为新用户会发现它很有用。 我相信目的是删除数据库本身并使用 EF Code First 方法重新创建它。 1.使用“.sln”扩展名在 Visual Studio 中打开您的项目。 2.选择服务器资源管理器(经常在左边) 3.选择 SQL Server 对象资源管理器。 4.您要删除的数据库将列在任何localDB下。右键单击它并选择删除。

              【讨论】:

              • 看起来 OP 正在寻找在命令行上运行的命令,因为他们明确提到了update-database,并且由于他提到了播种,我假设他们正在寻找用于测试的自动化解决方案。因此,您的 UI 解决方案可能不是他们想要的。
              【解决方案12】:

              由于新的 EF Core 用户有一天会点击这个问题,而且我发现热门答案有些不必要的破坏性,因此我将向您展示一种“重新开始”的方法。请注意,这会删除您的所有数据。

              1. 删除 MS SQL 服务器上的所有表。同时删除 __EFMigrations 表。
              2. 输入dotnet ef database update
              3. EF Core 现在将从零开始重新创建数据库,直到您最近一次迁移。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-11-30
                相关资源
                最近更新 更多