EF6.4 Migration配置HasKey(x=>x.Id)未生成Identity列问题问询
Entity Framework 6 中Id列无法生成自增配置的原因及解决方案
问题原因
- 基类或全局配置覆盖了EF默认的自增约定:EF6默认会将名为
Id的long类型主键识别为自增列,但如果你在全局配置、基类映射中显式给Entity或ProductEntity的Id属性设置了DatabaseGeneratedOption.None,子类会继承该配置,导致默认约定失效。 - 迁移快照残留:如果之前生成过该表的非自增迁移,即使删除了迁移文件,迁移快照中仍然会保留该表的旧配置,后续生成迁移时会沿用旧配置,不会重新按约定生成自增属性。
- 主键关联外键配置:如果存在未显式写出的Fluent API配置,将
ProductDetailSnapshot的Id设置为了指向其他表主键的外键,EF会自动关闭自增属性,避免主键值冲突。
解决方案
1. 映射中显式强制配置自增
直接在ProductDetailSnapshotMapping的构造方法中,在HasKey之后追加属性配置,显式指定Id为自增列,优先级高于所有全局或基类约定:
public ProductDetailSnapshotMapping() { HasKey(t => t.Id); // 追加这行配置即可 Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); }
配置完成后重新添加迁移,就能自动生成带identity: true的建表代码。
2. 残留配置排查步骤
如果显式配置后仍然不生效,按以下步骤操作:
- 检查所有Fluent API配置,查找是否有针对
Entity、ProductEntity基类,或IEntity接口的全局配置,确认没有给Id属性设置非自增的逻辑。 - 删除Migrations文件夹下所有和
ProductDetailSnapshot相关的迁移文件,同时删除迁移快照文件(文件名格式为[你的DbContext名称]Snapshot.cs),再重新执行Add-Migration命令生成新迁移即可。
内容的提问来源于stack exchange,提问作者DLeh
相关产品推荐
相关产品推荐

