0

我正在使用实体框架代码进行第一次迁移。我第一次没有启用迁移。当我运行这个项目时,它创建了一个包含一行的_migrationhistory表。EF如何在没有迁移历史记录表的情况下检测模型更改

然后我删除这个表并运行应用程序,它运行成功。现在我添加一个属性到实体并尝试运行,但它没有运行抱怨该模型与数据库不兼容。

我的问题是如何EF和数据库知道模型改变或数据库是不同的模型没有_migrationhistory表或在代码中的迁移?

+0

EF只在应用迁移时查看_migrationhistory。如果使用migratedatabasetolatestversion,它将构建模型并将其与上次代码迁移的资源文件中存储的模型(如果没有空白数据库)进行比较。如果他们不匹配,你会得到这个错误。见[这里](https://channel9.msdn.com/Blogs/EF/Migrations-Under-the-Hood)。 –

回答

1

实体框架首先检查数据库是否有_migration历史记录表。如果没有,则会尝试创建一个并从头开始运行所有迁移,并将迁移名称作为记录插入迁移历史记录表中。

因为您已经删除了迁移历史记录表,实体框架无法将其迁移记录与迁移文件进行比较。因此,它会尝试再次运行所有迁移。但是,这个数据库已经有相关实体的表格。因此,向用户显示错误消息(型号与数据库不兼容)。

+0

您的陈述“因此,它试图再次运行所有迁移”,我没有任何迁移。 –

+1

“dbo._MigrationHistory”表不会在没有任何初始迁移的情况下创建。检查Migrations文件夹下的任何迁移文件。 – Tejus

+1

也在Configuration.cs中检查AutomaticMigrationsEnabled是否设置为true或false。如果设置为true,则实体框架将自动尝试升级数据库而不使用迁移文件。 – Tejus

相关问题