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

初始化代码必须幂等

相关推荐
老邓计算机毕设2 分钟前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
麦聪聊数据22 分钟前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构
2301_7903009627 分钟前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
初级代码游戏28 分钟前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
m0_7369191043 分钟前
用Pandas处理时间序列数据(Time Series)
jvm·数据库·python
亓才孓43 分钟前
[JDBC]PreparedStatement替代Statement
java·数据库
m0_466525291 小时前
绿盟科技风云卫AI安全能力平台成果重磅发布
大数据·数据库·人工智能·安全
大空大地20262 小时前
流程控制语句--switch多分支语句使用、while循环语句的使用、do...while语句、for循环
c#
爱学习的阿磊2 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python
枷锁—sha2 小时前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全