__MigrationHistory存在但未被检测到,调用CompatibleWithModel时报错
解决方案
你遇到的是EF6中CompatibleWithModel校验逻辑的已知场景,在已确认迁移存在、权限正常的前提下,按以下优先级排查即可:
- 校验__MigrationHistory表的架构归属
EF默认只会读取dbo架构下的迁移历史表,若你数据库的__MigrationHistory创建在非dbo架构下,会被判定为不存在。
可执行以下SQL确认表所属架构:
SELECT SCHEMA_NAME(schema_id) AS SchemaName FROM sys.tables WHERE name = '__MigrationHistory'
如果返回架构不是dbo,可在MyDbContext的OnModelCreating方法中显式指定迁移历史表的架构:
// 方式1:指定全局默认架构 modelBuilder.HasDefaultSchema("你的实际架构名"); // 方式2:仅指定迁移历史表的架构 modelBuilder.Entity<HistoryRow>().ToTable("__MigrationHistory", "你的实际架构名");
- 校验运行时连接字符串是否匹配
包管理器控制台运行迁移时使用的连接字符串,和程序运行时MyDbContext读取的连接字符串可能存在不一致。可在调用CompatibleWithModel前打断点,查看db.Database.Connection.ConnectionString指向的数据库,确认就是存在__MigrationHistory记录的目标库。 - 校验模型哈希匹配性
CompatibleWithModel本质是比对当前运行时生成的模型哈希,和__MigrationHistory表最新记录中Model字段存储的哈希是否一致。如果存在动态模型配置(比如运行时根据条件修改实体映射)、或者EF版本变动导致哈希生成逻辑变化,就会出现校验失败。
你可以先将方法参数改为false避免直接抛异常,确认是否是元数据读取问题:
// 参数设为false时,找不到元数据会返回false而非抛出异常 var compatible = db.Database.CompatibleWithModel(false);
如果返回false,可以删除现有迁移文件,重新生成初始化迁移,再通过Update-Database -Script生成增量脚本,仅更新__MigrationHistory表的最新Model字段值即可,无需修改业务表结构。
- 校验EF版本一致性
确认项目中安装的EntityFrameworkNuget包版本,和__MigrationHistory表记录的ProductVersion值(你当前是6.4.4)完全一致,版本不匹配会导致元数据解析失败。
内容的提问来源于stack exchange,提问作者Kirsten
相关产品推荐
相关产品推荐

