I am trying to implement FirebirdSql.EntityFrameworkCore.Firebird 7.5.0 in a project but am having some challenges purely because of my own lack of knowledge.
In particular I am stuck with: SQL error code = -104 Token unknown.
I am using context as follows:
public class TraderDbContext : DbContext
{
static readonly ILoggerFactory _loggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); });
private string _provider = string.Empty;
private string _connectionString = string.Empty;
public DbSet<region> Regions { get; set; }
public TraderDbContext(string provider, string connectionString)
{
_provider = provider;
_connectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
switch (_provider)
{
case "IntegrityRetail":
optionsBuilder.UseLoggerFactory(_loggerFactory).UseFirebird(_connectionString);
break;
}
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Map table names
var typeBuilder = modelBuilder.Entity<region>();
typeBuilder.Property(p => p.Id).HasColumnName("RG_ID");
typeBuilder.Property(p => p.Name).HasColumnName("RG_NAME");
typeBuilder.ToTable("REGIONS");
}
}
And querying as follows:
var query = from r in dbContext.Regions
select r;
return await query.ToListAsync();
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 3.1.3 initialized 'TraderDbContext' using provider 'FirebirdSql.EntityFrameworkCore.Firebird' with options: None
fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
Failed executing DbCommand (35ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT "r"."RG_ID", "r"."RG_NAME"
FROM "REGIONS" AS "r"
fail: Microsoft.EntityFrameworkCore.Query[10100]
An exception occurred while iterating over the results of a query for context type 'RFIDModule.Data.TraderDbContext'.
FirebirdSql.Data.FirebirdClient.FbException (0x80004005): Dynamic SQL Error
SQL error code = -104
Token unknown - line 2, column 16
So this query works:
return await dbContext.Regions.FromSqlRaw("SELECT RG_ID, RG_NAME FROM REGIONS").ToListAsync();
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]Entity Framework Core 3.1.3 initialized 'TraderDbContext' using provider 'FirebirdSql.EntityFrameworkCore.Firebird' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]Executed DbCommand (16ms) [Parameters=[], CommandType='Text', CommandTimeout='30']SELECT RG_ID, RG_NAME FROM REGIONSThis query does not:
return await dbContext.Regions.ToListAsync();
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]Entity Framework Core 3.1.3 initialized 'TraderDbContext' using provider 'FirebirdSql.EntityFrameworkCore.Firebird' with options: Nonefail: Microsoft.EntityFrameworkCore.Database.Command[20102]
Failed executing DbCommand (27ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT "r"."RG_ID", "r"."RG_NAME"FROM "REGIONS" AS "r"fail: Microsoft.EntityFrameworkCore.Query[10100]An exception occurred while iterating over the results of a query for context type 'RFIDModule.Data.TraderDbContext'.FirebirdSql.Data.FirebirdClient.FbException (0x80004005): Dynamic SQL Error
SQL error code = -104Token unknown - line 2, column 16
AS---> Dynamic SQL Error
SQL error code = -104Token unknown - line 2, column 16
------------------------------------------------
It appears that Firebird does not like the generated query. It gets really upset about the AS statement.
However when I remove AS statement it is happy. So do not know how to adjust the generated code in the entity framework to work correctly.