7

我在我的应用程序中使用 EF 迁移和 SQL Azure 数据库。在我手动删除 SQL Azure 中的表之前,它工作正常。现在,当我发布我的应用程序时,删除的表不是在 SQL Azure 中创建的。这是我得到的错误。

Cannot find the object "dbo.TableName" because it does not exist 
or you do not have permissions.

我觉得我在数据库和我的模型之间造成了一些不一致。

我正在使用自动迁移。

4

1 回答 1

4

为什么一开始就删除表?你希望它被重新创建吗?

在我们进入更棘手的解决方案之前,您是否尝试过使用 -TargetMigration 选项回滚到在其中创建表的迁移之前的迁移?我感觉你会在尝试删除不存在的 fk 的表或索引时遇到 SQL 错误,但值得一试。您可以使用此命令执行此操作update-database -TargetMigration YourOldMigration。这将通过运行迁移文件的 Down() 方法中的命令回滚在目标迁移之后应用的所有迁移。如果您遇到 SQL 错误,您可以尝试修改 Down() 方法的内容以避免错误。小心。这可能会导致数据丢失。如果 EF 对此发出警告而您不在乎。尝试将 -Force 添加到命令的末尾。

或者,另外......

您的迁移不仅仅是通过将您的 db 方案与您的 dbcontext/models 进行比较来计算的。如果您在 sql server management studio 中打开 sql azure 数据库,您应该会看到一个名为 __MigrationHistory 的表。它存储通过自动迁移应用到您的数据库的所有迁移。

请在开始之前通读一遍。在开始之前,您需要考虑一些因素。假设您尚未对此进行操作,您应该能够为最初创建表的更改集找到一行。删除该行。现在 EF 自动迁移会认为该更改尚未应用于您的数据库。如果您运行 update-database 它应该尝试重新运行它。

如果您对该迁移文件进行了其他更改,它也会尝试重新运行这些更改。这可能会导致各种 sql 错误。您可能希望手动回滚也是该迁移的一部分的所有更改。担心数据丢失?尝试将数据复制到手动创建的表中进行存储,直到完成为止。完成迁移后,您可以将数据复制回新表/列中。

双重选择。如果您对开发不太感兴趣,并且您对数据丢失没有太多顾虑,那么删除整个数据库并让自动迁移从头开始重新创建它可能会更容易。

希望能让你到达那里

于 2012-12-20T12:31:21.180 回答