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

