Entity Framework Core链接Oracle的问题

发布时间:2021-09-16

最近使用 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 来进行分页。

其他阅读

静态文件防盗链的一种思路

在我们的系统中,总会有一些资源需要保护起来不被盗走,如果是动态接口可以通过验证权限来保护,静态资源大多需要对外开放,比较难以保护,本文就介绍保护静态文件资源一种思路——那就是使用 HTTP 中 Referer 头。

查看原文

安卓开发 | 实现输入框自动全选内容

在安卓开发中,当用户手动选中输入框时。输入框内部的内容全部选中是一个比较提升用户体验的功能,主要用在一些复制的场景中。

查看原文

WPF中切换主题功能

在现代 Windows 系统中,系统提供了亮色主题和暗色主题,Windows 自带的应用程序都已经适配该功能。本文介绍在使用 WPF 构建 Windows 窗口应用时怎么实现主题切换。

查看原文

GUID和UUID

GUID,英文全称为 Global Unique Identifier,意为全局唯一标识符,UUID,英文全称为 Universally Unique Identifier,意为通用唯一标识符,都具有唯一性,GUID也是微软对UUID是的实现。

查看原文

解决黑苹果/Mac无法写入NTFS硬盘

在黑苹果(Hackintosh)系统中,默认只能以只读方式挂载NTFS格式的硬盘,无法直接写入数据。这给用户在读写Windows分区或外接NTFS硬盘时带来诸多不便。本文会介绍几种可行方案,并最终推荐使用 Mounty for NTFS 这一轻量化工具。

查看原文