EF迁移对象已存在错误。

23

我正在从数据库开始使用Entity Framework的ASP.NET MVC项目上工作。我获取了每个表在数据库中的模型。我对这些模型进行了一些更改,启用了迁移,并在初始化迁移时遇到了错误:

数据库中已经存在一个名为“TableName”的对象。

我尝试过使用update-database -force,但没有帮助。初始迁移创建了已经存在的表!

如何使初始迁移应用对模型的更改而不是从头创建表?

在这种情况下,同步数据库和模型之间的更改的最佳实践是什么?

5个回答

33

尝试运行

Add-Migration InitialCreate –IgnoreChanges 

在Package Manager Console中运行此命令。这将创建一个空迁移,并将当前模型作为快照。然后运行

Update-Database 

在Package Manager Console中运行该命令,将会对数据库应用InitialCreate迁移。由于实际迁移没有任何更改,它只会向__MigrationsHistory表添加一行,指示已经应用了此迁移。

请参见此处

然后修改您的模型并添加迁移。

另一种方法是简单地注释up和down方法中的所有代码。


如果我在 SqlServer Management Studio 中对数据库进行更改,是否有任何同步模型的方法? - Arianit
我认为你需要像数据库优先方法一样重新生成模型。 - Amr Alaa
嗯,@Arianit,简单地删除连接字符串,删除上下文模型,使用代码优先模型从数据库重新生成具有相同上下文名称的类,然后您就可以开始了 ;)。 - Muhammad Younus
在开始操作之前,请注意您是否在连接字符串中错误地输入了数据库名称。 - user692942
3
Add-Migration命令:找不到与参数名"IgnoreChanges"匹配的参数。 - amr ras

6

对于我来说,最好且有效的方法是在初始迁移文件的 UP 和 Down 函数中注释掉所有代码,然后执行 dotnet ef database update 命令,这应该可以正常工作。请确保在注释掉初始迁移之前更新迁移。


它对我起作用了,但是使用 dotnet ef database update - Maxime
1
@Maxime 谢谢,我已经更新了答案,是个愚蠢的错误。 - Danish Shaikh

3
如果以上内容都无法解决您的问题,您可以检查您的代码是否使用了该方法。
context.Database.EnsureCreated()

请注意,该方法不应用任何迁移(来源)(你可以通过向数据库执行类似“select * from __EfMigrationHistory”的SQL查询来检查,并确保该数据库上不存在任何迁移)。

EF提供了一个非常好的方法来解决这个问题,那就是

context.Database.Migrate()

这不仅可以确保你有一个数据库,而且可以使用迁移并将你的数据库迁移到最新版本。

希望能对你有所帮助。


1
你的回答是关于 DotNetCore 的,但他/她正在寻找 ASP.NET MVC 框架。 - Peyman Majidi

2

当您删除先前的迁移并尝试创建已存在的新表时,会出现此错误。恢复先前的迁移,一切都会没问题。

需要注意的是,这里的“迁移”指的是数据库迁移,即对数据库进行版本控制的工具。如果您不熟悉数据库迁移,请参考相关文档或寻求专业人士帮助。

另外,“Original Answer”可翻译为“最初的答案”或“原始回答”,具体取决于上下文语境。


4
我该如何恢复之前的迁移记录? - Mayer Spitz

1
Amr Alaa的解决方案可行,但数据库没有迁移到最新的模型。
以下是它的工作原理(使用自动迁移):
  1. Delete Migrations folder
  2. Execute enable-migrations
  3. Set this two properties to true in the newly created Configuration.cs

    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }
    
  4. Execute Update-Database -Force

您的数据库将会更新到最新方案并准备就绪。

希望这能有所帮助。


1
Enable-Migrations 已过时。 - mavi
你需要在这个类,比如 Configuration 上创建自己的构造函数吗?即使 AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; 没有解决,如何解决它们呢? - Lutaaya Huzaifah Idris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接