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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:57:40