实体框架创建空迁移但坚持我的模型不同

时间:2014-03-25 23:57:44

标签: c# ef-migrations entity-framework-6.1

今天是悲伤的一天。今天第一件事我看到EF异常说“支持'DomainContext'上下文的模型自创建数据库以来已经改变。”。接近午夜,我仍然看到这个错误。这是我职业生涯的终结 - (

我很确定模型中没有任何变化,但错误出现了。我试过创建一个新的迁移,它是空的:

public void Up()
{
}
public void Down()
{
}

应用此迁移没有任何好处 - 错误仍然存​​在。我使用了常见的建议将初始化设置为null:

Database.SetInitializer<DomainContext>(null);

当我访问数据库时,它使错误消失了。但这让我非常困扰 - 每当我尝试通过代码运行迁移时,我再次看到类似的错误:

var configuration = new Migrations.Configuration();

configuration.TargetDatabase = new DbConnectionInfo("correct connection string", "System.Data.SqlClient");

var migrator = new DbMigrator(configuration);

migrator.Update(); // <<-- exception is thrown here

异常抛出如下所示: System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException:无法更新数据库以匹配当前模型,因为存在挂起的更改并禁用了自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移。

我已更新到EF 6.1(之前是6.0.2),但这没有任何区别。

让我感到烦恼的是,我可以通过Nuget控制台运行迁移:

Update-Database

运行良好,不会出现任何问题。但是,当我将DB初始化程序设置为自动运行迁移时:

var initializer = new MigrateDatabaseToLatestVersion<DomainContext, Migrations.Configuration>();
Database.SetInitializer(initializer);
var domainContext = new DomainContext();
domainContext.Database.Initialize(true); // <<-- this throws exception

无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移。

真正的问题是,为什么EF在运行Nuget控制台和迁移DB-Initialiser时对模型有不同的哈希值?我怎样才能找出不同的东西(来自db-state的模型)?以及如何解决这个问题,所以我不必使用hacks(为db-initaliser分配null)?

2 个答案:

答案 0 :(得分:6)

我的问题的原因是应用于其中一个模型的[AllowHtml]属性。在我将MVC更新为5.1.1并将WebApi更新为2.1之后,问题就开始发生了。

我已从EF-Model中删除该属性并剥离并重新构建数据库,问题就消失了。

我写了一篇关于如何调试此类问题的博文:http://tech.trailmax.info/2014/03/inside_of_ef_migrations/

此外,我认为此[AllowHtml]属性是一个错误,我将创建一个可重现的解决方案,并将错误报告提交给EF-people。

更新:我实际上永远无法重现错误。类属性的[AllowHtml]属性与它无关。一个神奇的小故障。

答案 1 :(得分:0)

我今天遇到了同样的问题。 我在问题出现之前添加了一个ViewModel,一个View和Html.EnableClientValidation()

根本没有模型变化! 我做了一个假的改变,就像@Guilleon建议的那样,创建了一个有效的迁移...但它没有帮助。

然后我重新启动了Visual Studio,一切都恢复了。 一定是个小故障