【问题标题】:How to re-create database for Entity Framework?如何为实体框架重新创建数据库?
【发布时间】:2013-12-16 17:31:44
【问题描述】:

我的 ASP.Net MVC 5 项目使用 Code-First Entity Framework,陷入了糟糕的状态。我不关心丢失数据,我只想能够重新开始,重新创建数据库并开始使用 Code-First 迁移。

目前我处于每次尝试更新数据库都会引发异常或收到错误消息的状态。该网站也无法正确访问数据库。如何擦除所有迁移、重新创建数据库并从头开始,而无需创建新项目?换句话说,我想保留我的代码但删除数据库。

稍后我还希望同步部署数据库(Azure 上的 SQL Server)。同样,我不介意删除所有数据 - 我只是想让它工作。

请提供任何操作步骤以恢复清洁状态。非常感谢。

【问题讨论】:

  • TBH 如果你只是想DROP DATABASE 那么......

标签: asp.net-mvc entity-framework azure azure-sql-database


【解决方案1】:

我的解决方案最适合
- 删除了您的 mdf 文件
- 想要重新创建您的数据库。

为了重新创建您的数据库,您需要使用 Visual Studio 添加连接。

第 1 步:转到服务器资源管理器添加新连接(或查找添加数据库图标)。

第 2 步:将 Datasource 更改为 Microsoft SQL Server 数据库文件

第 3 步:在 数据库文件名 字段中添加所需的任何数据库名称。(最好与 web.config 中的名称相同 AttachDbFilename 属性)

第 4 步:点击浏览并导航到您希望放置的位置。

第五步:在包管理器控制台运行命令update-database

【讨论】:

    【解决方案2】:

    虽然这个问题的前提是不关心数据,但有时维护数据是必不可少的。

    如果是这样,我写了一个步骤列表,说明当数据库已经有同名表时如何从 Entity Framework 噩梦中恢复:How to recover from Entity Framework nightmare - database already has tables with the same name

    显然...版主认为适合删除我的帖子,所以我将其粘贴在这里:

    如何从 Entity Framework 的噩梦中恢复——数据库已经有同名的表

    描述:如果您的团队刚接触 EF 时像我们一样,您最终会处于无法创建新本地数据库或无法创建新本地数据库的状态将更新应用到您的生产数据库。你想回到一个干净的 EF 环境,然后坚持基础,但你做不到。如果你让它为生产工作,你就不能创建一个本地数据库,如果你让它为本地工作,你的生产服务器就会不同步。最后,您不想删除任何生产服务器数据。

    症状:无法运行 Update-Database,因为它正在尝试运行创建脚本,并且数据库已经有相同的表名字。

    错误信息:System.Data.SqlClient.SqlException (0x80131904): 那里 已经是数据库中名为 '' 的对象。

    问题背景:EF 根据数据库中名为 dbo.__MigrationHistory 的表了解当前数据库的位置与代码的位置。当它查看迁移脚本时,它会尝试与脚本协调它最后的位置。如果不能,它只是尝试按顺序应用它们。这意味着,它会回到最初的创建脚本,如果您查看 UP 命令的第一部分,它将是发生错误的表的 CreeateTable。

    要更详细地了解这一点,我建议您观看此处引用的两个视频: https://msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx

    解决方案:我们需要做的是让 EF 认为当前数据库是最新的,而不应用这些 CreateTable 命令。同时,我们仍然希望这些命令存在,以便我们可以创建新的本地数据库。

    第 1 步:清理生产数据库 首先,备份您的生产数据库。在 SSMS 中,右键单击数据库,选择“任务 > 导出数据层应用程序...”并按照提示进行操作。 打开您的生产数据库并删除/删除 dbo.__MigrationHistory 表。

    第 2 步:本地环境清洁 打开您的迁移文件夹并将其删除。我假设你可以在必要时从 git 中得到这一切。

    第 3 步:重新创建初始状态 在包管理器中,运行“Enable-Migrations”(如果您有多个上下文,EF 将提示您使用 -ContextTypeName)。 运行“添加迁移初始 -verbose”。这将创建初始脚本以根据当前代码从头开始创建数据库。 如果您在之前的 Configuration.cs 中有任何种子操作,请将其复制。

    第 4 步:欺骗 EF 此时,如果我们运行 Update-Database,我们将得到原始错误。因此,我们需要在不运行这些命令的情况下让 EF 认为它是最新的。因此,进入您刚刚创建的 Initial migration 中的 Up 方法并将其全部注释掉。

    第 5 步:更新数据库 由于在 Up 进程上没有要执行的代码,EF 将创建 dbo.__MigrationHistory 表,其中包含正确的条目,以表明它正确运行了此脚本。如果你喜欢,去看看吧。 现在,取消注释该代码并保存。 如果您想检查 EF 是否认为它是最新的,您可以再次运行 Update-Database。它不会使用所有 CreateTable 命令运行 Up 步骤,因为它认为它已经完成了。

    第 6 步:确认 EF 确实是最新的 如果您的代码尚未应用迁移,这就是我所做的...

    运行“Add-Migration MissingMigrations” 这实际上将创建一个空脚本。因为代码已经存在,所以在初始迁移脚本中实际上有创建这些表的正确命令,所以我只是将 CreateTable 和等效的 drop 命令剪切到 Up 和 Down 方法中。

    现在,再次运行 Update-Database 并观察它执行新的迁移脚本,在数据库中创建适当的表。

    第 7 步:重新确认并提交。 构建、测试、运行。确保一切都在运行,然后提交更改。

    第 8 步:让团队的其他成员知道如何进行。 当下一个人更新时,鉴于之前运行的脚本不存在,EF 将不知道发生了什么。但是,假设本地数据库可以被炸毁并重新创建,这一切都很好。他们将需要删除他们的本地数据库并再次从 EF 创建它。如果他们有本地更改和待迁移,我建议他们在 master 上再次创建他们的数据库,切换到他们的功能分支并从头开始重新创建这些迁移脚本。

    【讨论】:

      【解决方案3】:

      按照以下步骤操作:

      1)首先进入Visual Studio的Server Explorer,检查该项目的“.mdf”数据连接是否连接,如果连接,右键删除。

      2 ) 进入解决方案资源管理器,点击显示所有文件图标。

      3) 进入App_Data,右键删除该项目的所有“.mdf”文件。

      4) 右键删除 Migrations 文件夹并删除。

      5) 转到 SQL Server Management Studio,确保该项目的 DB 不存在,否则将其删除。

      6) 转到 Visual Studio 中的包管理器控制台并输入:

      1. Enable-Migrations -Force
      2. Add-Migration init
      3. Update-Database

      7) 运行您的应用程序

      注意:在第 6 步第 3 部分中,如果您收到错误“无法附加文件...”,可能是因为您没有在 SQL Server 中完全删除数据库文件。

      【讨论】:

      • 太棒了!这工作,谢谢!确实很有帮助。重新创建部署数据库 (Azure SQL) 的步骤是否相似?
      • 嗨@TobySharp,没问题。如果您的数据库中没有任何数据,您可以按照这些步骤操作,但如果您有数据,则步骤不太一样。
      • 我没有任何需要保留的数据。
      • 更新,如果您从 VS(如说明所述)而不是 Windows 资源管理器中删除,则它可以工作。另外,如果你没有 SQL Management Studio,你可以使用 VS 中的 Sql Object Explorer 从 localdb 中删除。
      • 如果您收到“无法附加文件...”错误,即使您认为自己已删除所有内容,请尝试从该线程中获得答案:stackoverflow.com/questions/13275054/…
      【解决方案4】:

      我想补充一点,林的回答是正确的。

      如果您不正确地删除了 MDF,您将不得不修复它。将项目中的拧紧连接固定到 MDF。简短的回答;重新创建并正确删除它。

      1. 创建一个新的 MDF 并将其命名为与旧的 MDF 相同,并将其放在相同的文件夹位置。您可以创建一个新项目并创建一个新的 mdf。 mdf 不必与您的旧表匹配,因为要删除它。所以创建或复制一个旧的到正确的文件夹。
      2. 在服务器资源管理器中打开它[在解决方案资源管理器中双击 mdf]
      3. 在服务器资源管理器中删除它
      4. 从解决方案资源管理器中删除它
      5. 运行update-database -force [必要时使用武力]

      完成,享受你的新数据库

      更新 2014 年 11 月 12 日 - 当我进行破坏性数据库更改时,我一直使用它。 我发现这是将迁移回滚到原始数据库的好方法:

      • 将数据库恢复到原来的状态
      • 运行正常迁移以将其恢复为当前

        1. Update-Database -TargetMigration:0 -force [这将销毁所有表和所有数据。]
        2. Update-Database -force [必要时使用武力]

      【讨论】:

      • 很高兴能提供帮助...我将更新我的答案。我最近发现了一种回滚所有更改的更好方法。
      • 更新的答案要简单得多!谢谢!把它放在你的答案之上;)
      【解决方案5】:

      只想补充@Lin的优秀回答:

      5) B. 如果您没有 SQL Management Studio,请转到“SQL Server 对象资源管理器”。 如果您在 localdb“SQL Server 对象资源管理器”中看不到您的项目数据库,请单击“添加 SQL 服务器”按钮手动将其添加到列表中。然后你可以从列表中删除数据库。

      【讨论】:

      • 如果您想在答案中添加内容,请在该答案中添加评论,而不是发布新答案。
      • 我没有意识到这一点。因此,现在您可以将您的答案移动到评论中并删除此答案,因为从技术上讲它不是问题的(完整)答案:-)
      【解决方案6】:

      这对我有用:

      1. 从 Visual Studio 中的 SQL Server 对象资源管理器中删除数据库。 右键单击并选择删除。
      2. 从文件系统中删除 mdf 和 ldf 文件 - 如果它们仍然存在。
      3. 重建解决方案。
      4. 启动应用程序 - 将重新创建数据库。

      【讨论】:

      • 是的,我所要做的就是删除 MDF,更新 web.config 中的连接字符串,然后运行应用程序并注册一个新帐户。它自动在新数据库中再次创建了所有表。
      【解决方案7】:

      一个对我有用的可能非常简单的修复。删除您在服务器/服务器对象资源管理器中找到的任何数据库引用和连接后,右键单击 App_Data 文件夹(我没有在应用程序中显示任何对象)并选择打开。一旦打开放置所有数据库/等。备份文件夹中的文件,或者如果您有胆量,请删除它们。运行您的应用程序,它应该从头开始重新创建所有内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-28
        • 1970-01-01
        • 2014-10-02
        • 1970-01-01
        • 1970-01-01
        • 2019-12-24
        • 1970-01-01
        相关资源
        最近更新 更多