代码优先和现有数据库

时间:2016-09-07 06:49:27

标签: ef-code-first database-migration ef-migrations

我正在开发一个使用SQL Server数据库的Windows应用程序。我有这个应用程序的不同版本,他们有不同的数据库结构,所以我需要在应用程序启动时将数据库迁移到最新版本。我想比较数据库结构和应用程序模型,然后更改,创建或删除命令。

此外,我想使用EF Code-First ORM,经过一些搜索,我发现首先在代码中有一些有用的命令和配置。但问题是,正如我所知,所有这些都会丢弃现有数据库并创建一个新数据库,因此在我需要数据时数据将会丢失。

我在应用程序启动函数中使用了这些行:

var migrator = new DbMigrator(new Configuration());
migrator.Update();

但在执行此行之后,我将得到此异常:

There is already an object named 'SomeTable' in the database.

我知道,它是正确的,有那张桌子,但结构改变了!我怎样才能比较结构并完成剩下的工作呢?

1 个答案:

答案 0 :(得分:0)

那不是how migrations work.您需要为每个版本的数据库进行迁移,以便EF可以检查__MigrationHistory表并查看是否已应用它。如果初始化程序设置为MigrateDatabaseToLatestVersion,则不会在模型更改时重新创建数据库。

您可以尝试重新创建历史记录:回滚到最旧的数据库,添加迁移,添加第二个最旧的版本更改,创建第二个迁移等等。

另一个选择是为您现在的位置添加迁移,生成脚本(update-database -Script),然后在应用之前注释掉每个已部署数据库中存在的内容。

另一种选择是对每个数据库和当前数据库使用VS Schema compare utility来获取更改。然后将基线迁移应用于每个(add-migration Initial -IgnoreChanges)。

现在,您可以生成一系列迁移,您的代码应该按预期工作。