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

初始化代码必须幂等

相关推荐
李广坤1 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Scout-leaf1 天前
WPF新手村教程(三)—— 路由事件
c#·wpf
用户298698530141 天前
程序员效率工具:Spire.Doc如何助你一键搞定Word表格排版
后端·c#·.net
爱可生开源社区2 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
mudtools2 天前
搭建一套.net下能落地的飞书考勤系统
后端·c#·.net
玩泥巴的3 天前
搭建一套.net下能落地的飞书考勤系统
c#·.net·二次开发·飞书
唐宋元明清21883 天前
.NET 本地Db数据库-技术方案选型
windows·c#
lindexi3 天前
dotnet DirectX 通过可等待交换链降低输入渲染延迟
c#·directx·d2d·direct2d·vortice
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql