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
相关产品推荐
相关产品推荐

