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

初始化代码必须幂等

相关推荐
m0_748554813 小时前
golang如何实现用户订阅偏好管理_golang用户订阅偏好管理实现总结
jvm·数据库·python
weixin_520649873 小时前
WinForm数据展示组件ListView
c#
早日退休!!!4 小时前
《数据结构选型指南》笔记
数据结构·数据库·oracle
xcLeigh4 小时前
KES数据库性能优化实战
数据库·sql·性能优化·sql优化·数据性能
阿正呀4 小时前
Redis怎样实现本地缓存的高效失效通知
jvm·数据库·python
yoyo_zzm4 小时前
Laravel9.x新特性全解析
数据库·mysql·nginx
2501_901200534 小时前
mysql如何设置InnoDB引擎参数_优化innodb_buffer_pool
jvm·数据库·python
m0_495496415 小时前
mysql处理复杂SQL性能_InnoDB优化器与MyISAM差异
jvm·数据库·python
forEverPlume6 小时前
PHP怎么使用Eloquent Attribute Composition属性组合_Laravel通过组合构建复杂属性【方法】
jvm·数据库·python
2301_809204706 小时前
mysql在docker容器中如何部署_利用docker-compose快速启动
jvm·数据库·python