Entity Framework 6上下文访问报错 重复创建Settings表问题求助
问题根因
你遇到的两个异常本质都是EF迁移的模型状态、数据库实际结构、__MigrationHistory系统表的迁移记录三者不同步导致的:
- 第一个
表已存在异常是因为EF检测到对应迁移未被标记为已执行,每次上下文初始化时都会重复执行迁移脚本里的CreateTable逻辑 - 第二个
自动迁移已禁用异常是因为你关闭自动迁移后,EF检测到模型与数据库结构存在未同步的变更,又无法通过自动迁移修复,所以抛出报错
解决方案
1. 修复不一致的迁移状态
你之前新增空Initial迁移未生效,是因为没有带上-IgnoreChanges参数,EF仍然会检测到模型与数据库结构的差异,不会将当前状态标记为已同步,按以下步骤处理:
- 如果你对应的数据库里已经有完整的表结构和数据,不需要重新生成,先删掉你之前创建的所有迁移文件
- 在程序包管理器控制台执行命令:
Add-Migration InitialBaseline -IgnoreChanges,这条命令会生成空的迁移文件,将当前的模型状态标记为同步基线,不会包含任何建表/改表操作 - 执行命令:
Update-Database,这条命令会将基线迁移的记录写入数据库的__MigrationHistory表,EF后续就会认为当前数据库结构和模型完全匹配,不会再尝试重复建表
2. 调整迁移配置
如果你使用显式代码迁移(即手动执行Add-Migration生成的迁移脚本),建议关闭自动迁移,避免自动迁移的不可控修改导致状态再次不同步,修改迁移配置类:
public Configuration() { AutomaticMigrationsEnabled = false; // 关闭自动迁移 }
后续有模型变更时,统一执行Add-Migration [自定义迁移名称]生成显式迁移脚本,再执行Update-Database应用到数据库即可。
3. 优化种子数据写入逻辑(可选)
你当前把初始数据插入逻辑写在迁移的Up方法里,只有第一次执行迁移时才会生效,建议挪到Seed方法中,使用EF提供的AddOrUpdate方法实现幂等写入,不需要手动处理IDENTITY_INSERT开关:
protected override void Seed(MyContext context) { context.Settings.AddOrUpdate( x => x.Id, new Settings { Id = 1, Name = "Name1", Value = "Value1" }, new Settings { Id = 2, Name = "Name2", Value = "Value2" } ); context.SaveChanges(); }
4. 校验连接字符串
确认MyContext使用的connectionString指向的是你预期操作的数据库,避免出现代码连接的数据库和你手动修改的数据库不是同一个的低级错误。
内容的提问来源于stack exchange,提问作者Maciej Wdowiarz-Bilsk
相关产品推荐
相关产品推荐

