EF InMemoryDatabase添加实体报错:配置主键为CottageId却提示CottageCode冲突
问题根因
该异常不是InMemory数据库自行判定主键导致的,本质是你的Cottage实体配置中,CottageCode被设置为了**备用键(Alternate Key)**或者带唯一约束的索引:
- EF Core的变更跟踪器会将备用键、主键都作为实体的唯一标识,只要任意一个唯一键的值重复,就算主键值不同,也会抛出实例已被跟踪的异常。
- 你可以先核对
IEntityTypeConfiguration<Cottage>的实现,排查是否存在builder.HasAlternateKey(x => x.CottageCode)、builder.HasIndex(x => x.CottageCode).IsUnique()这类配置;另外如果你将CottageCode作为其他实体的外键关联字段,EF Core也会隐式为其生成备用键,同样会触发该限制。 - 若要确认当前生效的主键配置,可以在DbContext初始化后执行调试代码验证:
var primaryKey = context.Model .FindEntityType(typeof(Cottage))? .FindPrimaryKey()? .Properties .FirstOrDefault()? .Name; // 输出primaryKey确认是否为CottageId
修复方案
根据你的业务需求二选一即可:
- 若业务不需要
CottageCode全局唯一:直接删除CottageCode对应的备用键、唯一索引配置即可,调整后重新执行种子数据插入就不会报错。 - 若业务确实需要
CottageCode唯一,仅测试场景需要临时插入重复值:- 为集成测试单独编写适配测试的
IEntityTypeConfiguration<Cottage>实现,跳过CottageCode的唯一约束配置,是最规范的解决方案; - 临时方案可以在每次插入实体后调用
context.ChangeTracker.Clear()清除跟踪状态,再插入下一条重复CottageCode的实体,仅适用于不需要同时跟踪多个重复Code实体的测试场景。
- 为集成测试单独编写适配测试的
内容的提问来源于stack exchange,提问作者Classic Neil
相关产品推荐
相关产品推荐

