【Entity Framework】disable automatic migration, 执行update-migration仍然会显示有automatic migration

本文涉及的相关问题,如果你的问题或需求有与下面所述相似之处,请阅读本文

  • [Entity Framework] disable automatic migration, 执行update-migration仍然会显示有automatic migration
  • [Entity Framework] code base migration / automatic migration

问题起因

今天在做项目的时候需要修改db的两个column,将两个column的type改为nullable.

public int? AUsage { get; set; }
public int? BUsage { get; set; }

Package Manager Console中输入命令

Add-Migration xxxx

结果发现报错,提示有部分pending migration.这个好解决,其实只要将那部分pending的migration文件删除就可以了.但是由于项目是共同开发的.我担心删除后会影响到以后的db部署.网上查到这些pending的migration需要执行一次

update migration(-Vobose)

当然了,部分pending的migration顺利更新到DB,但是有一个migration还是报错.提示就如同下方所示

Applying explicit migrations: [201805081508118_CreateOrganisation].
Applying explicit migration: 201805081508118_CreateOrganisation.
Applying automatic migration: 201805081508117_CreateOrganisation_AutomaticMigration.
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'Answers' in the database.

好奇怪我没看到我的migration文件中有类似于201805081508117_xxxxx_AutomaticMigration这种文件, 那么为什么update database的时候需要执行一次explicit migration,和一次automatic migration呢?

我检查了我的configuration文件,显示已经关闭了automatic migration

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    AutomaticMigrationDataLossAllowed = false;
}

于是没有办法,只能上网查找解决方案.

问题排查

首先必须了解什么是EF的两种migration方式

automatic migration 简而言之就是可以在你加入一个model后运行application, EF会自动将这个实体类更新到相应的DB中,无需你做其他的操作.但是如果你是对于一个已经存在的model实体类的属性进行修改, 这种模式无法自动更新到DB.
code base migration 这种migration是我项目中用的方式.这种方式相比较前者更加灵活, 可以通过配置来进行灵活的migration以及revert.主要使用命令行的方式进行操作DB,详细的资料可以去文章下方找对应的链接细看.

那么目前来看我们项目中使用的是code-based migration. 但是为何会在命令行出现automatic的字样? 我还是没有解决这个问题. 后来我在Stack Overflow上查到一个问题现象和我一样的,但是没有相关的回答. (后期我在解决了问题后也回去解答了问题).

此外找到了一篇资料跟我的情况还算类似. 其中提问者自问自答了问题, 说是项目进行阶段, 不知道什么原因, automatic migration和code-based migration被混合使用了.其中automatic migration的资源文件resx文件里面有个source属性会导致在update-database的时候必须执行一次automatic migration...

好吧回来看看这个方案能否解决我的问题, 我将出现问题的migration的资源文件的source属性remove掉之后, 再次执行update-migration.
果然可以将pending的migration顺利update到db的_MigrationHistory当中了...
问题算是解决...

参考资料

Stack Overflow:
解决问题的链接https://stackoverflow.com/questions/12341470/update-database-tries-to-do-an-automatic-migration-even-with-automatic-migration
我的Stack Overflow回答https://stackoverflow.com/questions/50679792/disable-automatic-migrations-in-entity-framework/54320652?noredirect=1#comment95460550_54320652
code base migration && automatic migrationhttp://www.entityframeworktutorial.net/code-first/code-based-migration-in-code-first.aspx
othershttps://coding.abel.nu/2012/02/ef-migrations-and-a-merge-conflict/


希望以上内容能够帮助到遇到同样问题的你.如有其它思路可以随时联系我.
N|Dennis

posted @ 2019-01-23 17:05  YanyuWu  阅读(381)  评论(0编辑  收藏  举报