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

EF Core 7 Code-First下实现字段大小写敏感存储的问题咨询

在EF Core 7中实现字段大小写敏感存储

EF Core 7已移除了AttributeToColumnAnnotationConvention这类基于约定的配置方式,你可以通过检测自定义特性并配置数据库列的区分大小写排序规则来实现需求,核心是让数据库层面将大小写不同的字符串视为不同值。

步骤1:保留原自定义CaseSensitive特性

你的自定义特性无需修改,继续使用即可:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class CaseSensitive : Attribute
{
    public CaseSensitive()
    {
        IsEnabled = true;
    }

    public bool IsEnabled { get; set; }
}

步骤2:在DbContext中配置大小写敏感规则

在OnModelCreating方法中,遍历所有实体属性,检测CaseSensitive特性,然后针对对应列设置区分大小写的数据库排序规则(不同数据库语法不同,以下分场景给出示例):

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 遍历所有实体类型
    foreach (var entityType in modelBuilder.Model.GetEntityTypes())
    {
        // 遍历当前实体的所有属性
        foreach (var property in entityType.GetProperties())
        {
            var caseSensitiveAttr = property.PropertyInfo?.GetCustomAttribute<CaseSensitive>();
            if (caseSensitiveAttr != null && caseSensitiveAttr.IsEnabled)
            {
                // 根据你使用的数据库类型选择对应配置
                var propertyBuilder = modelBuilder.Entity(entityType.ClrType).Property(property.Name);

                // --- SQL Server 配置示例 ---
                // 设置列类型为nvarchar并指定区分大小写的排序规则(CS=Case Sensitive)
                propertyBuilder.HasColumnType("nvarchar(255) COLLATE Latin1_General_CS_AS");

                // --- PostgreSQL 配置示例 ---
                // 使用C排序规则(区分大小写)
                // propertyBuilder.HasColumnType("text COLLATE \"C\"");

                // --- MySQL 配置示例 ---
                // 使用utf8mb4_bin二进制排序规则(区分大小写)
                // propertyBuilder.HasColumnType("varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin");
            }
        }
    }

    // 额外:如果ItemName是值对象,需配置其与字符串的转换(确保EF正确映射)
    modelBuilder.Entity<Gender>()
        .Property(g => g.Name)
        .HasConversion(
            name => name.Value,
            value => ItemName.Create(value).Value);

    // 其他模型配置逻辑...
}

关键说明

  • 排序规则是数据库层面的设置,确保数据库在存储和比较时区分字符串大小写,从而实现"Male"和"male"作为不同行保存。
  • 不同数据库的排序规则语法差异较大,请根据实际使用的数据库调整HasColumnType的内容:
    • SQL Server:常用区分大小写排序规则如Latin1_General_CS_AS、SQL_Latin1_General_CP1_CS_AS
    • PostgreSQL:COLLATE "C"会按二进制值比较,严格区分大小写
    • MySQL:utf8mb4_bin是二进制排序规则,直接比较字符的二进制编码,区分大小写
  • 若你的ItemName是值对象,必须配置HasConversion让EF Core正确将其映射为数据库字符串类型,否则上述大小写配置无法生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:23:26