You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core添加复合键表记录时出现索引重复条目异常

问题:EF Core复合键实体添加部分键重复记录时触发唯一索引异常

我定义了包含复合键的ProxyInfo类,当尝试添加一条复合键整体唯一但部分键(ProxyID)与已有记录重复的记录时,出现唯一键冲突异常。相关代码及错误信息如下:

数据实体类

public class ProxyInfo
{
    [Key, Column(Order = 0, TypeName = "varchar")]
    [StringLength(80)]
    public string AccountID { get; set; } = string.Empty;

    [Key, Column(Order = 1, TypeName = "varchar")]
    [StringLength(80)]
    public string ProxyID { get; set; } = string.Empty;

    [ForeignKey(nameof(ProxyID))]
    public virtual UserInfo? Proxy { get; set; }
    // 其他属性
}

OnModel配置

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ProxyInfo>()
    .HasKey(e => new { e.AccountID, e.ProxyID })
    .HasName("PK_ProxyInfo");

modelBuilder.Entity<ProxyInfo>()
    .HasOne(p => p.Proxy)
    .WithOne()
    .OnDelete(DeleteBehavior.NoAction);
// 更多配置代码
}

错误信息

A row with a duplicate key cannot be inserted in the dbo.ProxyInfo
object with the unique IX_ProxyInfo_ProxyID-Index. The duplicate
key value is "X".

尝试插入的复合键是{"B","X"},表中已有记录的复合键是{"A","X"},两条记录应可同时存在以关联同一UserInfo记录。经排查发现初始迁移时为ProxyID创建了带unique:true属性的索引,请问如何让EF Core忽略该索引的重复值限制?


解决方案

1. 修改实体关系配置

问题根源是HasOne().WithOne()的配置让EF Core认为这是一对一关系,因此自动为外键ProxyID添加了唯一索引。但实际业务需要的是一对多关系(一个UserInfo可以被多个ProxyInfo关联),所以需要调整关系配置:

modelBuilder.Entity<ProxyInfo>()
    .HasOne(p => p.Proxy)
    .WithMany() // 将WithOne()改为WithMany(),明确一对多关系
    .OnDelete(DeleteBehavior.NoAction);

2. 生成并应用新迁移

修改配置后,生成新的迁移文件来移除原来的唯一索引:

# 包管理器控制台命令
Add-Migration RemoveProxyIDUniqueIndex
Update-Database

# 或者终端命令(.NET CLI)
dotnet ef migrations add RemoveProxyIDUniqueIndex
dotnet ef database update

3. (可选)手动修改现有迁移文件

如果不想生成新迁移,可以找到初始迁移中创建IX_ProxyInfo_ProxyID的代码,移除IsUnique()配置项,再执行数据库更新操作。

修改后,EF Core会将关系识别为一对多,不再强制ProxyID字段唯一,即可正常插入同一ProxyID对应不同AccountID的记录。


内容的提问来源于stack exchange,提问作者Razzupaltuff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:40:37