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")));

这时候再执行例如分页,取第一行操作时,就不会使用 OFFSETLIMIT,而是去使用 ROWNUM 来进行分页

发布时间:2021-09-16
其他阅读

Nginx配置反向代理和负载均衡

Nginx是一个流行的Web容器,作为服务的入口,使用反向代理和负载均衡,达到隐藏和保护内部服务安全的作用,本文会描述Nginx反向代理和负载均衡的配置。

查看原文

Apple中的模糊效果

本文主要介绍在前端里比较重要的一个效果——高斯模糊效果,也有人称为毛玻璃特效。在Mac和Windows系统样式上也都在使用模糊效果。下面聚焦于Web前端中的模糊效果开发。

查看原文

Js使用原型链对对象进行扩展

在C#的扩展方法中,我们了解到了一种不需要修改源对象定义即可为对象添加新的行为的方法,在JavaScript中,我们通过原型链也可以实现类似的效果,为对象添加新的行为。需要一定的Js原型链基础。

查看原文

解决sqlite依赖无法打包单文件的问题

在一次WPF开发中,选用了sqlite作为内嵌数据库,使用 ystem.Data.SQLite 库来调用,在使用 Fody 进行单文件打包时,发现打包文成后会出现 x86 和 x64 两个特定的文件夹,分别对应着32位和64位的 SQLite.Interop.dll,本文介绍修改项目文件来实现将 sqlite 通信库一起打包成单文件的方法。

查看原文

Angular中开发一个代码库

Angular 的复杂项目中,我们可以对其拆分出不同功能模块进行开发,但是对于大型项目,或者我们直接考虑拆成库,将一部分的模块合起来组成一个库,方便复用,比如我们熟悉的各种设计组件库,就是一堆模块的合集。

查看原文