EF Core + PostgreSQL 配置表设计踩坑记录:从 23505 到 ChangeTracker 冲突

初始问题

表结构设计

复制代码
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);

初始化代码必须幂等

相关推荐
XDHCOM1 天前
ORA-32484重复列名错误,ORACLE数据库CYCLE子句故障修复与远程处理方案
数据库·oracle
翻斗包菜1 天前
PostgreSQL 日常维护完全指南:从基础操作到高级运维
运维·数据库·postgresql
呆瑜nuage1 天前
MySQL表约束详解:8大核心约束实战指南
数据库·mysql
liliangcsdn1 天前
Agent Memory智能体记忆系统的示例分析
数据库·人工智能·全文检索
那个失眠的夜1 天前
Mybatis延迟加载策略
xml·java·数据库·maven·mybatis
Rick19931 天前
SQL 执行流程
数据库·sql
M--Y1 天前
Redis常用数据类型
数据结构·数据库·redis
猿小喵1 天前
MySQL慢查询分析与处理-第二篇
数据库·mysql·性能优化
周杰伦fans1 天前
C# required 关键字详解
开发语言·网络·c#
Y001112361 天前
MySQL-进阶
开发语言·数据库·sql·mysql