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

Entity Framework搭配Firebird Dialect 1生成SQL不兼容问题求助

解决Entity Framework连接Firebird时生成SQL含多余引号导致的-104错误

我之前也踩过EF和Firebird搭配的这个坑,你遇到的FbException: Dynamic SQL Error SQL error code = -104 Token unknown问题,本质是EF生成的SQL给表/列名加了多余引号,而Firebird对带引号的标识符大小写敏感——如果你的数据库对象(表、列)是默认无引号创建的,Firebird会将其视为大写的不区分大小写标识符,带引号的话就会严格匹配大小写,自然找不到对应的对象。

具体解决步骤:

  • 配置EF映射,匹配Firebird的标识符规则
    在你的ContextManager的OnModelCreating方法里,调整实体映射,确保EF生成的SQL不带引号,且匹配数据库里的实际对象名称(通常是大写):

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 全局配置:所有实体的表名、列名都使用大写,且不加引号
        modelBuilder.UseUpperCaseNamingConvention();
    
        // 也可以单独指定某个实体的映射(如果全局配置不适用)
        modelBuilder.Entity<Account>()
            .ToTable("ACCOUNTS") // 数据库中实际的表名
            .Property(x => x.OBJID)
            .HasColumnName("OBJID"); // 数据库中实际的列名
    }
    
  • 修改Firebird连接字符串,禁用标识符引号
    在连接字符串中添加QuoteIdentifiers=False参数,告诉Firebird的EF驱动不要自动给标识符加引号:

    User=SYSDBA;Password=masterkey;Database=YourDB.fdb;DataSource=localhost;Port=3050;Dialect=3;QuoteIdentifiers=False;
    
  • 验证生成的SQL
    可以开启EF的日志功能,确认生成的SQL已经不带多余引号:

    public ContextManager()
    {
        // 将生成的SQL输出到控制台,方便调试
        this.Database.Log = sql => Console.WriteLine(sql);
    }
    

    运行你的查询代码后,应该能看到类似这样的SQL:

    SELECT a.OBJID, a.[其他列] FROM ACCOUNTS a WHERE a.OBJID = 1

    没有引号包裹的标识符,Firebird就能正常执行查询了。

你的示例查询代码本身没有问题,只要完成上面的配置,context.Accounts.Where(x => x.OBJID == 1).ToList()就能正常返回数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:38:15