如何从头开始删除和重新创建现有的EF Code First数据库


84

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

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

我该怎么做?

Answers:


110

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

如果您想start clean

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

2)删除所有migration files-位于Migrations-下方,并命名为数字等。-删除所有,

3)重建包含迁移(及其余)的项目-并确保将您的项目设置(配置)为自动生成(有时可能会引起问题-但对您而言不太可能),

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


5
因此,没有命令进行ef迁移来删除数据库本身吗?
cjb110 2014年

1
...据我所知(不确定最新版本)-EF /迁移擅长在没有Db时“创建”,然后在更改代码时“更新”。但是,当您需要进行一些管理员维护时,必须动手操作
NSGaga(在2014年

1
我还必须从SQL Server对象资源管理器中删除数据库。
史蒂文·杰里斯

在运行Update-Database之前,我必须重新启动Visual Studio才能正常工作。第一次尝试在生成新结构的过程中发生了错误,尽管添加迁移没有任何报告的问题。
Patric's

2
@lpacheco如果您的生产数据库包含不想破坏的数据,那么,我谨建议您,一个名为“如何删除...现有数据库”的问题对您来说不是一个正确的问题。 。
Mark Amery

60

如果使用命令以正确的方式创建迁移,Add-Migration "Name_Of_Migration"则可以执行以下操作以重新启动当然,重置,但数据丢失):

  1. Update-database -TargetMigration:0

    自从执行down方法以来,通常您的数据库现在为空。

  2. Update-database

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


1
Update-database -TargetMigration:0需要使用-f(force)标志才能删除所有内容,否则它将表示可能的数据丢失。命令应为:Update-database -TargetMigration:0 -f
Tascalator

@Tascalator,我只是在没有-f的情况下尝试了此操作,并且没有关于可能的数据丢失的警告。使用EF 6.1.2,表中有被删除的数据。
2015年

完美的答案。快捷方便!Thnx
sapatelbaps

根据EF Core Docs,正确的参数名称是-Target(对于EF Core 1.1)或-Migration(对于EF Core 2.0)
Harvey Darvey

32

从Package Manager控制台拖放,创建和播种的单一衬里:

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

Kaboom。


5
为什么需要两次执行同​​一步骤?“ update-database -force”我的意思是
SwissCoder

请注意:“ AutomaticMigrationDataLossAllowed = true;” 在配置中是必需的。
Unicco

2
EF Core中的等效语法为just Update-Database 0。无论如何,这并不适合OP的“更新历史记录似乎不同步”的情况;此方法通过对到目前为止已应用于数据库的每个迁移运行“向下”迁移来起作用,因此,如果您删除了先前已应用的迁移,则此操作将失败(并且如果在之后修改了迁移,则同样可能失败应用)。该接受的答案是更加健壮。-1,以及无法解释的重复update-database -force
Mark Amery

1
@SwissCoder-您不需要两次相同的步骤(至少我不需要)。我认为那是一个错字。
Ed Graham

1
@SwissCoder坦白地说,我没有注意到,没有打算过犯
Vima91

31

对于EntityFrameworkCore,可以使用以下命令:

Update-Database -Migration 0

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

Remove-Migration

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

Add-Migration Initialize
Update-Database

在EFCore v2.1.0上测试


2
奇迹般有效!
pavelnieks

4

怎么样 ..

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

我是从《编程实体框架:代码优先》,第28页的第一版中挑选的。


11
这不是一个很好的ida。很有可能该代码可能会正式投入生产,您最终会与客户头疼……
Amadeo Gallardo

这仅在模型更改时删除数据库,OP希望在不更改模型的情况下删除数据库。
量子


0

请执行以下步骤:

  1. 删除那些应该从上下文中删除的对象,//Dbset<Item> Items{get;set;} 并在Nuget Console中运行以下命令
  2. add-migration [contextName]
  3. 更新数据库-详细

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


0

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


0

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


既然OP明确地提到了update-database,并且他提到了种子,所以OP似乎正在寻找在命令行上运行的命令,因此我认为他们正在寻找用于测试的自动化解决方案。因此,您的UI解决方案可能不是他们想要的。
valkn0t

-2

由于有一天,新的EF Core用户将点击这个问题,而我发现最常见的答案可能会造成不必要的破坏,因此,我将向您展示一种“新鲜”的方法。当心,这将删除您的所有数据。

  1. 删除MS SQL Server上的所有表。同时删除__EFMigrations表。
  2. 类型 dotnet ef database update
  3. EF Core现在将从零开始重新创建数据库,直到您进行最新迁移为止。
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.