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


143

使用Code-First Entity Framework,我的ASP.Net MVC 5项目陷入了困境。我不在乎丢失数据,我只想能够重新启动,重新创建数据库并开始使用Code-First迁移。

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

稍后,我还将希望同步部署数据库(Azure上的SQL Server)。同样,我不介意删除所有数据-我只想使其正常运行。

请提供任何操作步骤以恢复到干净状态。非常感激。


TBH,如果您只是简单地想要DROP DATABASE....
Worthy7 '16

Answers:


209

请按照以下步骤操作:

1)首先转到Visual Studio中的服务器资源管理器,检查此项目的“ .mdf”数据连接是否已连接,如果已连接,请右键单击并删除。

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

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

4)通过右键单击并删除删除迁移文件夹。

5)转到SQL Server Management Studio,确保该项目的数据库不存在,否则请删除它。

6)转到Visual Studio中的程序包管理器控制台,然后键入:

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

7)运行您的应用程序

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


优秀的!这行得通,谢谢!确实非常有帮助。重新创建部署数据库(Azure SQL)的步骤是否相似?
Toby Sharp

嗨@TobySharp,没问题。如果数据库中没有任何数据,则可以执行以下步骤,但是如果您有数据,则步骤并不完全相同。

我没有任何需要保留的数据。
Toby Sharp

3
更新,如果您从VS(按照说明说)而不是Windows资源管理器中删除,则它可以工作。另外,如果没有SQL Management Studio,则可以在VS中使用Sql Object Explorer从localdb中删除。
Mike Ward

3
如果您收到“无法附加文件...”错误,即使您认为自己已删除所有内容,请尝试从以下线程获得答案: stackoverflow.com/questions/13275054/…–
Andy

44

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

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

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

完成,享受您的新数据库

更新11/12/ 14-进行重大的数据库更改时,我一直都在使用它。我发现这是将迁移回滚到原始数据库的好方法:

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

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

1
非常高兴为您提供帮助...我将更新我的答案。我最近发现了一种回滚所有更改的更好方法。
史蒂夫·科尔曼

8

这为我工作:

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

1
是的,我要做的就是删除MDF,更新web.config中的连接字符串,然后运行该应用程序并注册一个新帐户。它再次自动在新数据库中创建了所有表。
丹·贝查德

3

尽管此问题的前提是不关心数据,但有时数据的维护至关重要。

如果是这样,我写了一个步骤列表,说明当数据库已经有同名的表时如何从Entity Framework噩梦中恢复如何从Entity Framework梦m中恢复-数据库已经具有同名表

显然...主持人认为适合删除我的帖子,因此将其粘贴在此处:

如何从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会提示您使用-Co​​ntextTypeName)。运行“添加迁移初始-详细”。这将创建初始脚本,以基于当前代码从头开始创建数据库。如果您在先前的Configuration.cs中进行了任何种子操作,则将其复制。

步骤4:诱骗EF 此时,如果我们运行Update-Database,我们将得到原始错误。因此,我们需要诱使EF认为它是最新的,而无需运行这些命令。因此,在刚刚创建的初始迁移中进入Up方法,并全部注释掉。

步骤5:Update-Database 在Up进程中无需执行任何代码的情况下,EF将使用正确的条目创建dbo .__ MigrationHistory表,以表明它正确运行了该脚本。去看看是否喜欢。现在,取消注释该代码并保存。如果要检查EF是否认为它是最新的,可以再次运行Update-Database。它不会使用所有CreateTable命令运行“向上”步骤,因为它认为已经完成了此步骤。

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

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

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

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

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


1

只想添加到@Lin的出色答案:

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


如果要在答案中添加一些内容,请在该答案中添加评论,而不要发布新答案。
奥利弗·

1
我没有意识到这一点。所以现在您可以将您的答案移入评论,并删除该答案,因为从技术上讲,它不是问题的(完整)答案:-)
Oliver

0

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


0

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

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

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

步骤2:将数据源更改为Microsoft SQL Server数据库文件

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.