初始问题
表结构设计
Id int identity primary key
Name varchar(...)
Value varchar(...)
问题1:23505 重复键异常
23505: duplicate key value violates unique constraint "PK_Configs"
问题分析:
- Id 是自增主键
- 但配置是逻辑唯一的
- 多次初始化 / 重复插入导致主键冲突
解决方案
| 方案 | 说明 | 是否推荐 |
|---|---|---|
| 自增 Id | 技术主键 | ❌ |
| Name 作为主键 | 业务主键 | ✅ |
重构表结构:Name作为主键
CREATE TABLE "Configs" (
"Name" varchar(200) PRIMARY KEY,
"Value" varchar(2000) NOT NULL,
"Remark" varchar(500)
);
同时修改EFCore的实体与模型
Config 实体
public class Config
{
[Key]
public string Name { get; set; } = null!;
....
}
OnModelCreating 配置
entity.HasKey(e => e.Name);
问题2:EF Core ChangeTracker 冲突
The instance of entity type 'Config' cannot be tracked
because another instance with the same key value is already being tracked
看起来是是数据库问题,实际是同一个 DbContext 中,一个 Key 只能对应一个实体实例
解决方案
正确的 Config 初始化(Upsert 模式)
var exist = await _context.Configs
.AsNoTracking()
.FirstOrDefaultAsync(x => x.Name == item.Name);
if (exist == null)
_context.Add(item);
else
_context.Update(item);
初始化代码必须幂等