2016-09-07 127 views
0

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

另外我想使用EF代码优先ORM,经过一番搜索后,我发现有一些有用的命令和代码优先配置。但问题是,据我所知,所有这些都丢弃了现有的数据库并创建一个新的数据库,这样在我需要数据时数据就会丢失。

我在我的应用程序启动功能,使用这些行:

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

但执行这条线后,我会得到这个异常:

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

我知道,这是正确的,并有该表但结构改变了!我怎样才能比较结构,并做其余的?

回答

0

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

你可以尝试重新创建历史:回滚到最旧的数据库,添加一个迁移,添加第二古老的版本变化,创建第二个迁移等

另一种方法是添加一个迁移,你现在,生成一个脚本(update-database -Script),然后在应用它之前注释每个已部署数据库中存在的内容。

另一种选择是对每个数据库和当前数据库使用VS Schema compare utility以获取更改。然后对每个应用基线迁移(添加迁移初始-IgnoreChanges)。

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

相关问题