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

Joy*_*Joy 9 entity-framework-4 ef-migrations entity-framework-5 entity-framework-6

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

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

小智 5

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


Joy*_*Joy 2

我终于想出了解决办法。它基本上改变了我们如何使用迁移的策略。迁移添加迁移仅检查模型和可能的先前迁移时间戳cs文件。所以直到并且除非我们update-database在 nuget 中提供命令。它实际上永远不会知道哪些表已被手动删除。因此,当我们尝试执行一些迁移(例如对表进行更改)时,请考虑上下文。它会导致迁移出现问题,因为该表在数据库中不存在,但迁移假设它已经存在。为此,需要进行手动工作。以下是我们从数据库中手动删除表后的步骤

  1. 检查实体中存在的模型与数据库表的对应关系。如果我们发现数据库表中有一些异常,该异常从数据库中丢失,但它作为实体存在,这意味着。他们俩彼此不同步。所以我们必须找到每个 的 model => Table 关系。

  2. createTable如果我们已经创建了所有表的初始迁移,则从迁移文件中复制已删除的代码。

  3. 将其粘贴到最近生成的最后一个迁移文件中。然后生成脚本或运行update-database command. 这将创建已删除的数据库表。然而,没有自动命令可以在所有实体和数据库表之间同步。这是我们必须在迁移中部分手动跟踪的事情。