Entity Framework Core链接Oracle的问题
最近使用 Entity Framework Core
来链接 Oracle 11g 数据库
,发现很多 LINQ
语句使用起来都会有问题,查看日志输出发现是生成SQL语句无法被 11g
版本执行,好在Oracle官方已经给我们提供了解决方案。
配置日志输出
先说一下怎么配置 efcore
的日志输出,方便我们定位问题。
一般有两种方案,一是修改 appsetting.Developer.json
文件,将日志等级设为 Trace
输出全部调试日志,其中必然是包含着数据库操作日志的。
{
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Trace",
"Microsoft.Hosting.Lifetime": "Trace"
}
},
"ConnectionStrings": {
"Oracle": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User Id=SCOTT;Password=123;"
}
}
上述方案会打印所有的调试日志,包含很多无用的信息,如果只想看数据库操作,则可以单独在 DbContext
中进行配置,重载 OnConfiguring
方法即可
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.LogTo(Console.WriteLine);
预设Oracle数据库版本
Oracle官方提供的 Entity Framework Core
扩展包在执行时,会将 LINQ
翻译成 12c
以上版本使用的语法,其中包含着很多新语法,比如 OFFSET
, LIMIT
, OUTER APPLY
等,这些新语法在 11g
及之前的版本都是无法执行的
解决方案是在注册 DbContext
时,就指定好版本为 11
,那在使用时,LINQ
就可以被翻译成老版本语法
services.AddDbContext<AppDbContext>(
x => x.UseOracle(
Configuration.GetConnectionString("Oracle"),
y => y.UseOracleSQLCompatibility("11")));
这时候再执行例如分页,取第一行操作时,就不会使用 OFFSET
和 LIMIT
,而是去使用 ROWNUM
来进行分页