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

EF Core大小写敏感主键配置异常:添加实体触发重复键错误

问题

我在应用中使用EF Core与数据库交互,采用Code-First方式生成和迁移数据库。需存储外部API返回的实体,这些实体的ID为大小写敏感类型,API保证其唯一性并用于关联映射,因此将该ID设为实体主键。

我了解到EF和SQL默认大小写不敏感,需配置排序规则,于是在DbContext的OnModelCreating方法中,通过自定义CaseSensitiveAttribute识别属性,设置列排序规则为SQL_Latin1_General_CP1_CS_AS:

foreach (var entityType in modelBuilder.Model.GetEntityTypes()) 
{
    foreach (var property in entityType.GetProperties()) 
    {
        // 如果属性标记了CaseSensitiveAttribute,则设置大小写敏感排序规则
        if (property.PropertyInfo?.GetCustomAttribute<CaseSensitiveAttribute>() != null) 
        {
            property.SetCollation("SQL_Latin1_General_CP1_CS_AS");
        }
    }
}

迁移生成代码显示列已配置为大小写敏感:

APIEntityID = table.Column<string>(type: "nvarchar(450)", nullable: false, collation: "SQL_Latin1_General_CP1_CS_AS")

但尝试添加仅主键大小写不同的实体时,调用dbContext.DbSet<entity>.Add(entityToAdd)会抛出异常,提示实体已被添加到其他实例。我确认无重复添加操作,且首次出现大小写不同主键就触发错误,请问需补充什么配置才能让EF正确支持大小写敏感?

解决方案

你遇到的问题是EF Core上下文的实体跟踪机制默认使用不区分大小写的字符串比较逻辑,即使数据库列配置了大小写敏感排序规则,内存中的主键对比还是会把"abc"和"ABC"判定为同一个主键,导致添加时报错。需要补充以下配置:

1. 为字符串类型主键指定大小写敏感的比较器

在OnModelCreating中,针对标记了CaseSensitiveAttribute的主键属性,设置其值比较器为StringComparer.Ordinal(大小写敏感的字符串比较器)。修改现有代码如下:

foreach (var entityType in modelBuilder.Model.GetEntityTypes()) 
{
    foreach (var property in entityType.GetProperties()) 
    {
        if (property.PropertyInfo?.GetCustomAttribute<CaseSensitiveAttribute>() != null) 
        {
            // 设置数据库列大小写敏感排序规则
            property.SetCollation("SQL_Latin1_General_CP1_CS_AS");
            
            // 针对主键属性,配置内存中的大小写敏感比较器
            var primaryKey = entityType.FindPrimaryKey();
            if (primaryKey != null && primaryKey.Properties.Contains(property))
            {
                property.SetValueComparer(StringComparer.Ordinal);
            }
        }
    }
}

2. 验证与生效

配置完成后,重新生成迁移并更新数据库(若需),此时EF的内存跟踪会将仅大小写不同的主键视为不同值,添加操作不会再抛出重复异常;同时数据库层面的大小写敏感排序规则会保证数据存储的唯一性约束生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:40:05