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

本文关键字:我的 坚持 模型 是不同 框架 创建 迁移 实体 | 更新日期: 2023-09-27 17:53:48

今天是悲伤的一天。今天的第一件事是我看到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。

我已经更新到EF 6.1(之前是在6.0.2上),但这没有什么不同。

另一件困扰我的事情是我可以通过Nuget Console运行迁移:

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。

真正的问题是为什么EF在通过Nuget控制台和Migrations db - initializer运行时具有不同的模型哈希值?我怎样才能找出不同之处(模型与db-state)?如何解决这个问题,这样我就不必使用hack(将null赋值给db- initializer)?

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

导致我的问题的原因是应用于其中一个模型的[AllowHtml]属性。在我将MVC更新到5.1.1和WebApi更新到2.1之后,麻烦开始发生。

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

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

我也认为这个[AllowHtml]属性是一个bug,我将创建一个可重复的解决方案,并将bug报告提交给EF-people。

Update:我实际上永远无法重现错误。类属性上的[AllowHtml]属性与此无关。

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

没有任何模型更改!我做了一个假的改变,就像@Guilleon建议的那样,并创建了一个工作迁移…但它没有帮助。

然后我重新启动了Visual Studio,一切又正常了。一定是故障