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);

初始化代码必须幂等

相关推荐
微学AI1 小时前
一款数据库SQL防火墙:可以拦截99.99%,可以阻止恶意SQL
数据库·sql
2401_884563241 小时前
Python Lambda(匿名函数):简洁之道
jvm·数据库·python
haixingtianxinghai2 小时前
Redis真的是单线程吗?
数据库·redis·缓存
FirstFrost --sy2 小时前
MySQL复合查询
数据库·mysql
八苦2 小时前
如何用c# 做 mcp/ChatGPT app
c#·mcp
imuliuliang2 小时前
MySQL的底层原理与架构
数据库·mysql·架构
尽兴-2 小时前
Redis7 底层数据结构解析
数据结构·数据库·缓存·redis7
m0_730115113 小时前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
qq_410194293 小时前
SQL语句性能优化
数据库·sql·性能优化
小江的记录本3 小时前
【MyBatis-Plus】Spring Boot + MyBatis-Plus 进行各种数据库操作(附完整 CRUD 项目代码示例)
java·前端·数据库·spring boot·后端·sql·mybatis