我正在使用实体框架代码进行第一次迁移。我第一次没有启用迁移。当我运行这个项目时,它创建了一个包含一行的_migrationhistory表。EF如何在没有迁移历史记录表的情况下检测模型更改
然后我删除这个表并运行应用程序,它运行成功。现在我添加一个属性到实体并尝试运行,但它没有运行抱怨该模型与数据库不兼容。
我的问题是如何EF和数据库知道模型改变或数据库是不同的模型没有_migrationhistory表或在代码中的迁移?
我正在使用实体框架代码进行第一次迁移。我第一次没有启用迁移。当我运行这个项目时,它创建了一个包含一行的_migrationhistory表。EF如何在没有迁移历史记录表的情况下检测模型更改
然后我删除这个表并运行应用程序,它运行成功。现在我添加一个属性到实体并尝试运行,但它没有运行抱怨该模型与数据库不兼容。
我的问题是如何EF和数据库知道模型改变或数据库是不同的模型没有_migrationhistory表或在代码中的迁移?
实体框架首先检查数据库是否有_migration历史记录表。如果没有,则会尝试创建一个并从头开始运行所有迁移,并将迁移名称作为记录插入迁移历史记录表中。
因为您已经删除了迁移历史记录表,实体框架无法将其迁移记录与迁移文件进行比较。因此,它会尝试再次运行所有迁移。但是,这个数据库已经有相关实体的表格。因此,向用户显示错误消息(型号与数据库不兼容)。
EF只在应用迁移时查看_migrationhistory。如果使用migratedatabasetolatestversion,它将构建模型并将其与上次代码迁移的资源文件中存储的模型(如果没有空白数据库)进行比较。如果他们不匹配,你会得到这个错误。见[这里](https://channel9.msdn.com/Blogs/EF/Migrations-Under-the-Hood)。 –