EF Core操作Oracle自治数据库时自动添加双引号问题求解
解决EF Core连接Oracle自治数据库时对象名带双引号的问题
针对你遇到的EF Core生成带双引号的SQL导致Oracle表找不到的问题,以下是几种无需切换DevArt包的解决方法:
方法一:全局配置模型映射规则
在你的ApplicationDbContext(继承自IdentityDbContext的类)中重写OnModelCreating方法,统一将所有表、列、键和索引的名称转为大写,并确保EF不添加引号:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 先调用Identity的默认配置 base.OnModelCreating(modelBuilder); // 遍历所有实体类型,统一配置命名规则 foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { // 将表名转为大写 var originalTableName = entityType.GetTableName(); if (!string.IsNullOrEmpty(originalTableName)) { entityType.SetTableName(originalTableName.ToUpper()); } // 将列名转为大写 foreach (var property in entityType.GetProperties()) { var originalColumnName = property.GetColumnName(); if (!string.IsNullOrEmpty(originalColumnName)) { property.SetColumnName(originalColumnName.ToUpper()); } } // 处理主键、外键和索引的名称为大写 foreach (var key in entityType.GetKeys()) { var originalKeyName = key.GetName(); if (!string.IsNullOrEmpty(originalKeyName)) { key.SetName(originalKeyName.ToUpper()); } } foreach (var index in entityType.GetIndexes()) { var originalIndexName = index.GetName(); if (!string.IsNullOrEmpty(originalIndexName)) { index.SetName(originalIndexName.ToUpper()); } } } // 可选:单独指定Identity核心表的名称(确保精确匹配) modelBuilder.Entity<IdentityRole>().ToTable("ASP.NETROLES"); modelBuilder.Entity<IdentityUser>().ToTable("ASP.NETUSERS"); modelBuilder.Entity<IdentityUserRole<string>>().ToTable("ASP.NETUSERROLES"); modelBuilder.Entity<IdentityUserClaim<string>>().ToTable("ASP.NETUSERCLAIMS"); modelBuilder.Entity<IdentityUserLogin<string>>().ToTable("ASP.NETUSERLOGINS"); modelBuilder.Entity<IdentityRoleClaim<string>>().ToTable("ASP.NETROLECLAIMS"); modelBuilder.Entity<IdentityUserToken<string>>().ToTable("ASP.NETUSERTOKENS"); }
方法二:配置Oracle EF Core选项关闭引号生成
在Program.cs(ASP.NET Core 6顶级语句模式)的数据库配置中,通过Oracle选项调整命名行为:
builder.Services.AddDbContext<ApplicationDbContext>(options => { var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); options.UseOracle(connectionString, oracleOptions => { // 适配Oracle数据库版本,根据你的自治DB版本调整(如12c/19c) oracleOptions.UseOracleSQLCompatibility("12"); // 迁移历史表名称设为大写,避免引号问题 oracleOptions.MigrationsHistoryTable("EF_MIGRATIONS_HISTORY"); // 关闭小写命名规则,使用原始名称配合后续转大写 oracleOptions.UseLowerCaseNaming(false); }); });
方法三:修正迁移文件中的表名
如果已经生成了迁移文件,打开对应迁移文件(如XXXX_CreateIdentitySchema.cs),确保CreateTable方法中指定的表名是大写且不带引号:
// 错误示例:带引号的表名 migrationBuilder.CreateTable( name: "\"AspNetRoles\"", columns: table => new { ... }); // 正确示例:大写无引号的表名 migrationBuilder.CreateTable( name: "ASP.NETROLES", columns: table => new { ... });
执行迁移时,EF会生成不带引号的SQL,自动匹配Oracle中大写的表名。
内容的提问来源于stack exchange,提问作者riciloma
相关产品推荐
相关产品推荐

