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

Entity Framework Core连接Interbase时引号问题求助

解决EF Core连接InterBase时生成带双引号SQL的报错问题

问题场景

使用EF Core连接InterBase数据库时,执行以下代码:

using (var db = new myContext())
{   
    var iqryble = db.Userlists.Select(d => d.USRID);
    var result = iqryble.ToList();
}

生成的SQL会在表名和列名周围添加双引号:

SELECT "u"."USRID"
FROM "USERLIST" AS "u"

触发InterBase报错:

Error at line 1
Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, char 11
.

解决方案

方法1:全局禁用标识符引号(推荐)

在myContext类的OnModelCreating方法中,统一配置所有实体和属性不使用引号包裹标识符:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var entityType in modelBuilder.Model.GetEntityTypes())
    {
        // 配置表名直接使用原始名称,不添加引号
        entityType.SetTableName(entityType.GetTableName());
        
        // 遍历所有属性,配置列名不添加引号
        foreach (var property in entityType.GetProperties())
        {
            property.SetColumnName(property.GetColumnName());
        }
    }
}

方法2:通过上下文配置直接禁用引号

如果使用InterBase专属的EF Core Provider,可以在注册DbContext时直接调用UseQuotedIdentifiers(false)全局禁用引号:

services.AddDbContext<myContext>(options =>
    options.UseInterBase("你的InterBase连接字符串")
           .UseQuotedIdentifiers(false));

方法3:单独配置实体/属性

若仅需针对特定实体或属性处理,可使用以下两种方式:

  • DataAnnotations 方式:
[Table("USERLIST")]
public class Userlist
{
    [Column("USRID")]
    public int USRID { get; set; }
    // 其他属性定义
}
  • Fluent API 方式:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Userlist>()
               .ToTable("USERLIST")
               .Property(u => u.USRID)
               .HasColumnName("USRID");
}

原理说明

EF Core默认用双引号包裹标识符以兼容大小写敏感的数据库场景,但InterBase默认不识别带双引号的标识符(手动开启QUOTED_IDENTIFIER数据库选项不推荐)。通过上述配置,可让EF Core生成适配InterBase语法的无引号SQL语句。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:40:17