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

