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

使用Oracle.EntityFrameworkCore:为何领域模型字段需设为大写?

EF Core 9 忽略数据库表/字段大小写配置方案

我正在使用Entity Framework Core 9,创建了对应数据库表的领域模型,并通过仓储模式返回数据。最初出现“表或视图不存在”的错误,于是在领域模型特性中将表名改为全大写:

[Table("MYTABLE")]
public class MyTableDM
{
    [Key]
    public decimal MYID { get; set; }
    public string MYNAME { get; set; }
    public DateTime MYDATE { get; set; }
}

问题有所进展,但随后出现“无效标识符”错误,将所有领域模型属性改为全大写后恢复正常。

请问是否有办法强制忽略大小写?无需在仓储中处理。

以下是我的仓储模拟代码:

public async Task<List<MyTableDM>> GetAllAsync()
{
    var myTableDTO = dbContext.MyTable.AsQueryable();
    return await myTableDTO.ToListAsync();
}

解决方案

可以通过EF Core的模型配置全局设置大小写不敏感映射,无需逐个添加特性或修改属性名:

1. 针对区分大小写的数据库(如Oracle/PostgreSQL)

这类数据库默认严格区分大小写,可通过全局约定实现自动映射:

方法一:Fluent API全局配置

在DbContext的OnModelCreating方法中添加统一规则:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 遍历所有实体,设置表名为大写
    foreach (var entityType in modelBuilder.Model.GetEntityTypes())
    {
        entityType.SetTableName(entityType.GetTableName().ToUpper());
        
        // 遍历所有属性,设置列名为大写
        foreach (var property in entityType.GetProperties())
        {
            property.SetColumnName(property.GetColumnName().ToUpper());
        }
    }
}

方法二:自定义约定(EF Core 8+支持)

如果需要复用规则,可创建自定义约定类:

public class UpperCaseNamingConvention : IModelFinalizingConvention
{
    public void ProcessModelFinalizing(IConventionModelBuilder modelBuilder, IConventionContext<IConventionModelBuilder> context)
    {
        foreach (var entityType in modelBuilder.Model.GetEntityTypes())
        {
            entityType.SetTableName(entityType.GetTableName().ToUpper());
            foreach (var property in entityType.GetProperties())
            {
                property.SetColumnName(property.GetColumnName().ToUpper());
            }
        }
    }
}

// 在DbContext中注册约定
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
    configurationBuilder.Conventions.Add(_ => new UpperCaseNamingConvention());
}

2. 针对SQL Server的配置

SQL Server默认依赖排序规则判断大小写,若出现问题:

  • 确保数据库排序规则为不区分大小写(如SQL_Latin1_General_CP1_CI_AS)
  • 也可使用上述Fluent API配置表/列名统一映射

3. 特殊场景处理

如果部分表/字段需要例外规则,可单独覆盖全局配置:

modelBuilder.Entity<MyTableDM>()
    .ToTable("CUSTOM_TABLE") // 单独指定表名
    .Property(p => p.MyId)
    .HasColumnName("CUSTOM_ID"); // 单独指定列名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:06:04