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

