2013-10-01 125 views
13

我有一堆Code First创建的表。如何强制EF代码首先重新创建数据库?

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

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

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

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

我读过了约context.Database.CreateIfNotExists();

我把它放在我的种子功能,但没有这样做。

谢谢!

+3

迁移不会为您修复残缺的数据库。它将数据库从已知状态转换为新的已知状态。您必须手动重新创建表或创建一个全新的数据库。 –

回答

10

为了解释与更新的数据库命令发生了什么,以及为什么在种子context.Database.CreateIfNotExists()方法不起作用:

当您运行更新的数据库命令,它首先看你的连接字符串是否数据库在那儿。如果是这样,它会查看迁移历史记录表,并检查与您的类别DbContext类别相关的内容。如果发现有表丢失或更改,它将尝试更新数据库。 Seed方法直到完成之后才被调用,所以这就是为什么不起作用。

在使用EF-代码首先,我通常是在几个不同的方式取决于我的数据库有多大接近问题的发展。我通常选择删除所有表(包括迁移历史表),然后再次运行update-database命令。工作得很好,如果你有很多FK约束很多的表,那就很费时间了。

我终于累了它,并发现these scripts做桌子的下降成倍速度更快。我去了这个,因为我在Azure上运行我的应用程序。当我在本地机器上运行它时,我将删除整个数据库并创建一个具有相同名称的全新数据库。

优雅的解决方案?没有。 它工作吗?或多或少...

+0

+1感谢您的阐述。 – Pinch

4

对于一个快速和肮脏的方法,即会送你回家吃饭上的时间,有很多dataloss沿

降DBO .__ MigrationHistory系统表(我使用的测试数据是仍处于测试阶段)

以及所有其他表格。

备份您的数据先!

update-database -verbose(你可能需要一些酱油蘸面条)

我没有印象,但它的作品。

希望有人会在未来想出更好的答案。

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

+1

这里有一些很好的提示:http://elegantcode.com/2012/04/12/entity-framework-migrations-tips/ – Colin

+0

@Colin感谢您的提示! – Pinch

+0

为了记录,'__MigrationHistory'不是一个系统表,只是一个带有前缀的常规表。 – MEMark

6

对于又一俗气选项...

右键点击服务器资源管理器中你的数据库,并点击删除 然后,你可以做

Enable-Migrations -EnableAutomaticMigrations -Force 

Update-Database -Force 

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

相关问题