14

我有一堆表 Code First 创建。

然后在 SQL 中,我删除了一个表,这样我就可以不可避免地在堆栈上提出这个问题。

update-database在包管理控制台中使用后,我得到:

找不到对象“dbo.ContractParents”,因为它不存在或您没有权限。

重新创建我的表的最佳方法是什么?

我读过关于context.Database.CreateIfNotExists();

我把它放在我的种子函数中,但什么也没做。

谢谢!

4

3 回答 3

9

要解释您的 update-database 命令会发生什么以及为什么context.Database.CreateIfNotExists()种子中的方法不起作用:

当您运行 update-database 命令时,它首先查看您的连接字符串以查看数据库是否存在。如果是,它会查看迁移历史记录表,并根据您的DbContext班级内容进行检查。如果它发现有表丢失或更改,它将尝试更新数据库。直到完成之后才会调用 Seed 方法,这就是为什么它不起作用的原因。

在使用 EF-Code First 进行开发时,我通常根据我的数据库的大小以几种不同的方式解决问题。我通常会删除所有表(包括迁移历史表),然后再次运行 update-database 命令。工作正常,如果你有很多表,上面有很多 FK 约束,那就真的很耗时。

我终于厌倦了它,并发现这些脚本可以使删除表的速度呈指数级增长。我之所以这样做,是因为我在 Azure 上运行我的应用程序。当我在本地机器上运行它时,我会删除整个数据库并创建一个具有相同名称的全新数据库。

优雅的解决方案?不,它有效吗?或多或少...

于 2013-10-01T16:17:23.390 回答
8

对于另一个俗气的选择...

在服务器资源管理器中右键单击您的数据库,然后单击删除然后您可以执行

Enable-Migrations -EnableAutomaticMigrations -Force

Update-Database -Force

肮脏的更新,干净的结果:)

于 2015-03-31T21:32:55.653 回答
4

对于一种快速而肮脏的方法,这会让你准时回家吃晚饭,同时也会丢失大量数据(我仍处于测试阶段,使用测试数据)

删除 dbo.__MigrationHistory 系统表

连同你所有的其他桌子。

首先备份您的数据!

update-database -verbose(你的意大利面可能需要一些酱汁)

我没有留下深刻的印象,但它确实有效。

希望将来有人会提出更好的答案。

这将有助于更好地理解迁移。

于 2013-10-01T15:59:33.823 回答