如何为实体框架重新创建数据库?

我的 ASP.Net MVC 5项目使用代码优先实体框架进入了一个糟糕的状态。我不在乎丢失数据,我只希望能够重新开始,重新创建数据库,并开始使用代码优先迁移。

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

稍后,我还想同步部署数据库(Azure 上的 SQLServer)。同样,我不介意放弃所有的数据-我只是想让它工作。

请提供任何指导步骤,以回到一个干净的状态。非常感谢。

123904 次浏览

遵循以下步骤:

1)先进入 VisualStudio 的伺服器资源管理器,检查「。此项目的“数据连接”已连接,如果已连接,请右键单击并删除。

2)转到解决方案资源管理器,单击“显示所有文件”图标。

3)转到 App _ Data,右键单击并删除该项目的所有“ . mdf”文件。

4)右击并删除删除迁移文件夹。

5)转到 SQLServerManagementStudio,确保这个项目的数据库不在那里,否则删除它。

6)在 VisualStudio 中进入包管理器控制台并键入:

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

7)运行你的应用程序

注意: 在步骤6的第3部分中,如果您得到一个错误“ Can not attthe file...”,这可能是因为您没有在 SQLServer 中完全删除数据库文件。

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

如果您不正确地删除 MDF,您将不得不修复它。修复项目中与 MDF 的错误连接。简短的回答; 正确地重新创建和删除它。

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

好了,好好享受你的新数据库吧

UPDATE 11/12/14-当我做出一个重大的数据库更改时,我总是使用这个命令。 我发现这是一个很好的方法来回滚您的迁移到原来的 db:

  • 把数据库恢复到原来的样子
  • 运行正常的迁移以将其恢复到当前

    1. 这将破坏所有表和所有数据
    2. 必要时使用武力

一个对我有效的简单方法。删除在 server/serverobject Explorer 中找到的任何数据库引用和连接后,右键单击 App _ Data 文件夹(没有为我显示应用程序中的任何对象)并选择 open。一旦打开把所有的数据库/等文件在一个备份文件夹或如果你有胆量只是删除他们。运行您的应用程序,它应该从头开始重新创建所有内容。

这对我很有效:

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

我只想补充一下@Lin 的绝妙回答:

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

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

如果是这样,我写了一个关于如何从实体框架恶梦中恢复的步骤列表,当数据库在这里已经有相同名称的表时: 如何从实体框架恶梦-数据库已经有相同名称的表

显然... 一个主持人觉得应该删除我的帖子,所以我把它粘贴到这里:

如何从实体框架恶梦-数据库已经有相同名称的表

Description : 如果您像我们一样,当您的团队是 EF 的新成员时,您最终将处于这样一种状态: 您要么不能创建新的本地数据库,要么不能对生产数据库应用更新。你想回到一个干净的 EF 环境,然后坚持基本的,但你不能。如果让它在生产环境下工作,就不能创建本地数据库,如果让它在本地环境下工作,生产服务器就会失去同步。最后,您不希望删除任何生产服务器数据。

Symptom : 无法运行 < em > 更新-数据库 ,因为它正在尝试运行创建脚本,而且数据库已经有了具有相同名称的表。

错误消息: System.Data.SqlClient.SqlException (0x80131904) : 有 已经是数据库中名为“的对象。

问题背景 : EF 理解当前数据库位于何处,而基于数据库中名为 dbo 的表的代码位于何处。移民历史。当它查看迁移脚本时,它会尝试重新调整上一次使用脚本的位置。如果不能,它只是试图按顺序应用它们。这意味着,它回到最初的创建脚本,如果您查看 UP 命令的第一部分,它将是发生错误的表的 CreeateTable。

为了更详细地理解这一点,我建议观看这里提到的两个视频: Https://msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx

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

步骤1: 生产数据库清洁 首先,为您的生产数据库做一个备份。在 SSMS 中,右键单击数据库,选择“ Tasks > Export Data-tier application...”并按照提示操作。 打开生产数据库并删除/删除 dbo. _ _ MigationHistory 表。

步骤2: 清洁当地环境 打开您的迁移文件夹并删除它。我假设您可以得到这一切从 git 如果必要的。

步骤3: 重新创建首字母 在 Package Manager 中,运行“ Enable-Migations”(如果您有多个上下文,EF 将提示您使用-ContextTypeName)。 运行“添加-迁移初始-详细”。这将创建基于当前代码从头创建数据库的初始脚本。 如果您在前面的 configuration.cs 中有任何种子操作,那么将其复制到对面。

第四步: 特技 EF 此时,如果我们运行 < em > 更新-数据库 ,就会得到原始错误。因此,我们需要欺骗 EF,让它认为它是最新的,而不运行这些命令。因此,进入您刚刚创建的 Initial迁移中的 Up 方法,并将其全部注释掉。

步骤5: 更新-数据库 在 Up 进程上没有执行任何代码,EF 将创建 dbo。_ _ MigationHistory 表,其中包含正确的条目,表示正确运行了此脚本。如果你愿意,可以去看看。 现在,取消该代码的注释并保存。 如果你想检查 EF 认为它是最新的,你可以再次运行 < em > 更新-数据库 。它不会使用所有 CreateTable 命令运行 Up 步骤,因为它认为已经完成了这一步。

步骤6: 确认 EF 实际上是最新的 如果你的代码还没有应用到迁移,这就是我所做的..。

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

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

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

第八步: 让你团队的其他成员知道如何继续。 当下一个人更新时,EF 将不知道什么击中了它,因为它以前运行的脚本不存在。但是,假设本地数据库可以被吹走并重新创建,那么这一切都很好。他们将需要放弃他们的本地数据库,并添加从 EF 再次创建它。如果他们有本地更改和挂起的迁移,我建议他们在 master 上再次创建 DB,切换到他们的特性分支,并从头重新创建那些迁移脚本。

我的解决方案最适合 :
删除你的 mdf 文件
想要重新创建你的数据库

为了使用 重建你的数据库,您需要使用 VisualStudio 添加连接。

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

步骤2 : 将 数据源改为 Microsoft SQL Server 数据库文件。 < br >

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

步骤4 : 单击浏览并导航到您希望它位于的位置。 < br >

步骤5 : 在包管理器控制台中运行命令 update-database