实体框架手动删除的表不能从EF迁移生成

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架手动删除的表不能从EF迁移生成相关的知识,希望对你有一定的参考价值。

我创建了迁移并创建了数据库和表。例如,表格是

A B C D E。现在我又改变了部分代码并运行了update-database命令。一切都顺利而且很好,表格显示了列。现在不小心我手动删除了两个表D and E。现在,当我尝试使用update-database运行迁移时。它运行正常但不会创建我手动删除的表。我试图删除现有的迁移并重新运行update-database。它给出了除两个表之外的错误。 “A,B,C”bla bla名称中已存在一个对象。

知道如何在不删除数据库的情况下摆脱这种情况并使用迁移重新创建已删除的表吗?因为我不想删除数据库,因为它包含其余表中的数据。如何在这种情况下继续我在数据库中有现有表,并且我不小心从SSMS手动删除了SQL Server中的几个表。

如何使用迁移重新创建表?

哦,我的实体框架版本是6.0.2

答案

我终于找到了解决方案。它基本上改变了我们如何使用迁移的策略。迁移添加迁移仅可以检查模型和先前的迁移时间戳cs文件。所以除非我们在nuget中提供update-database命令。从来没有真正知道哪些表已被手动删除。因此,当我们尝试执行某些迁移时,例如对表的更改。它会导致有问题的迁移,因为该表在数据库中不存在,但迁移假定它已存在。因此,有一个手工工作。以下是我们从数据库中手动删除表后的步骤

  1. 检查与数据库表对应的实体中存在的模型。如果我们发现数据库表中存在一些异常,这些异常在数据库中丢失,但它存在于实体中。他们俩彼此不同步。所以我们必须找到每个的model => Table关系。
  2. 如果我们使用所有表创建了初始迁移,则从迁移文件中复制已删除的createTable代码。
  3. 将其粘贴到最近生成的上一个迁移文件中。然后生成脚本或运行update-database command。这将创建已删除的数据库表。但是,没有自动命令可以在所有实体和数据库表之间同步。这是我们必须在迁移中部分手动跟踪的内容。
另一答案

EF迁移历史记录存储在表_MigrationHistory中。从数据库中删除表。警告:这将清除所有迁移历史记录,您必须重新创建所有表

另一答案

恕我直言最直接的解决方案是从迁移生成SQL脚本并仅运行脚本的一部分,从而创建缺少的表。

Update-Database -Source MigrationBeforeCreatingTables -Target MigrationAfterCreatingTables -Script

以上是关于实体框架手动删除的表不能从EF迁移生成的主要内容,如果未能解决你的问题,请参考以下文章

实体框架迁移 API

CoreData:不能轻量级迁移删除实体“没有这样的表”

EF生成实体模型注意事项

具有 2 个外键实体框架的表

使用实体框架手动输入密钥

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段