前言

目前.NET Core中据我了解到除了官方的EF Core外,还用的比较多的ORM框架(恕我孤陋寡闻哈,可能还有别的)有FreeSql、SqlSugar(排名不分先后)。FreeSql和SqlSugar都已早早支持国产数据库比如人大金仓、神通、达梦,要是项目要求支持适配国产数据库中,同时项目若早已使用上如上两种ORM框架,那并可以很愉快的玩耍了,要是使用EF Core就有点伤脑筋,只能自主写一套适配

十分钟对接人大进仓驱动

此文只是以最新版本作为示例,任意版本都可快速适配完人大金仓,基于我大国产数据库收费,当然就有技术支持,大可催官方出EF Core 5.x、6.x,当项目进行框架升级,但等不及官方出迭代版本,出完后,可能还需要当当小白鼠试验一番,本文未尝不是一条先行之道

通过官网仅提供V8 R6版本,所以下载其windows版本,最终可看到提供了对应不同版本的驱动

但是呢,EF Core版本仅为2.2.4,要是EF Core为3.1.x版本过高,当你调试时你会发现有异常,反编译其dll,其实里面有一部分方法并未实现,换句话说,在较高版本上底层EF Core做了实现,但2.2.4适配版本并未实现。我们用到的则是如下两个dll,第一个驱动作为程序集引用,另外一个则是适配EF Core

对EF Core还算有点熟悉,适配EF Core无非就三步走策略

1、基础设施:Microsoft.EntityFrameworkCore

2、关联映射:Microsoft.EntityFramework.Relational

3、数据迁移:Microsfot.EntityFramwork.Design

上面前两步是必要条件,至于最后一步看项目是否用到迁移,没用到可无需引入。讲到这里,你以为我准备自主实现这一套吗?不存在的,有捷径不走为何非得装个b勒!到其底层借鉴于PS,于是乎我下载efcore.pg 6.0.1版本

1、根据自身需要:如上删除没必要的包,什么测试项目啊,支持对日期转换插件等等啊(实际只需要EFCore.PG)其结构与EF Core源码一毛一样

2、归纳演绎法:

人大金仓适配EF Core命名Kdbndp.EntityFrameworkCore.KingbaseES,是否找到等同规律!我们将Npgsql全局替换为Kdbndp,同理将PostgreSQL全局替换为KinbaseES

对于异常处理,PostgresException全局替换为KingbaseException,系统数据库pg_ 全局替换为sys_(不替换也没问题,主要用于数据库表迁移,若用到迁移,就必须替换)。接下来则是将底层驱动Npgsql.dll替换为Kdbndp.dll,比较正规放到驱动文件夹中

将EFCore.PG项目文件中底层库,给移除,然后引用上述驱动文件夹程序集

生成解决方案,错误基本也就那么几十个而已(大多数错误来源于资源文件加载),根据实际情况修改修改没啥大问题,比如Npgsql底层驱动做了额外扩展,但对人大金仓而言(比如映射)则没有,就删除对应属性等等,若使用VS 2022生成解决方案时,加载资源文件时可能会出现如下错误

DTE”同时存在于“EnvDTE, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”和“Microsoft.VisualStudio.Interop, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”中

此时需要将/tools/Resources.tt打开,将如下

<#@ assembly name="EnvDTE" #>

指定本地该程序集实际目录(可能有根本上的解决方案)

<#@ assembly name="C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\PublicAssemblies\envdte.dll" #>

最后将EF.PG类库生成程序集名指定为人大金仓所提供程序集名称

小小测试一下执行查询并翻译sql语句

弱弱透露下,官方现仅提供R6,据悉针对R3版本貌似不再迭代更新,据我猜测可能是其底层基于PG,部分功能没有“借鉴”完,如下特性则是R3对应的Kdbndp.dll

总结

针对.NET 6基于Npgsql移植适配人大金仓稍微麻烦一丢丢,而对于.NET Core 3.x或5.x则简单很多,相关命名空间替换基本没啥错误,好了,这条捷径你get到了?此处是不是应该艾特下官方做适配的小伙伴,直接借鉴(https://github.com/npgsql/efcore.pg)适配,无需过多折腾呢!

教你10分钟对接人大金仓EF Core 6.x的更多相关文章

  1. 通过ODBC接口访问人大金仓数据库

      国产化软件和国产化芯片的窘境一样,一方面市场已经存在性能优越的同类软件,成本很低,但小众的国产化软件不仅需要高价买入版权,并且软件开发维护成本高:另一方面,国产软件目前普遍难用,性能不稳定,Bug ...

  2. DBeaver连接达梦|虚谷|人大金仓等国产数据库

    前言 工作中有些项目可能会接触到「达梦.虚谷.人大金仓」等国产数据库,但通常这些数据库自带的连接工具使用并不方便,所以这篇文章记录一下 DBeaver 连接国产数据库的通用模版,下文以达梦为例(其他国 ...

  3. QT 之 ODBC连接人大金仓数据库

    QT 之 使用 ODBC 驱动连接人大金仓数据库 获取数据库驱动和依赖动态库 此操作可在人大金仓官网下载与系统匹配的接口动态库,或者从架构数据库的源码中获取驱动和依赖动态库 分别为: 驱动动态库:kd ...

  4. 通过jmeter连接人大金仓数据库

    某项目用的人大金仓数据库,做性能测试,需要用jmeter来连接数据库处理一批数据.jmeter连接人大金仓,做个记录. 1. 概要 在"配置元件"中添加"JDBC Con ...

  5. [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  6. 教你10分钟内在Windows上完成Rails开发环境的安装和配置

    原文:http://www.cnblogs.com/tambor/archive/2011/12/25/rails_anzhuang_railsinstaller.html 一般来说,Windows开 ...

  7. 人大金仓KCI

    #include "bin/libkci.h" static void exit_nicely(KCIConnection *conn) { KCIConnectionDestor ...

  8. 10分钟就能学会的.NET Core配置

    .NET Core为我们提供了一套用于配置的API,它为程序提供了运行时从文件.命令行参数.环境变量等读取配置的方法.配置都是键值对的形式,并且支持嵌套,.NET Core还内建了从配置反序列化为PO ...

  9. 10分钟 在linux里创建.net core helloworld控制台程序

    官方教程 安装linux https://www.cnblogs.com/LittleFeiHu/p/9749455.html 第一步 :选择和你本机适用的Linux版本,我这里用的是18.04. 第 ...

随机推荐

  1. 爬虫系列:使用 MySQL 存储数据

    上一篇文章我们讲解了爬虫如何存储 CSV 文件,这篇文章,我们讲解如何将采集到的数据保存到 MySQL 数据库中. MySQL 是目前最受欢迎的开源关系型数据库管理系统.一个开源项目具有如此之竞争力实 ...

  2. RAC中常见的高级用法-bind方法

    RAC操作思想:      Hook(钩子)思想 RAC核心方法:bind      bind方法      假设想监听文本框的内容,并且在每次输出结果的时候,都在文本框的内容拼接一段文字" ...

  3. struct vs class in C++

    在C++中,除了以下几点外,struct和class是相同的. (1)class的成员的默认访问控制是private,而struct的成员的默认访问权限是public. 例如,program 1会编译 ...

  4. 【编程思想】【设计模式】【行为模式Behavioral】中介者模式Mediator

    Python版 https://github.com/faif/python-patterns/blob/master/behavioral/mediator.py #!/usr/bin/env py ...

  5. 2.8 GO 参数传递

    简单将GO中参数传递分为三类 数字.字符.字符串等类型 结构体 方法 GO的方法本身就是地址的入口,打印一个方法输出的是这个方法的地址 func test_func(){ //0x488a30 fmt ...

  6. System.exit(-1)和return 的区别

    对于只有一个单一方法的类或者系统来说是一样的,但是对于含有多个类和方法,且调用关系比较复杂时就不一样了. System.exit(-1)是指所有程序(方法,类等)停止,系统停止运行. return只是 ...

  7. liunx 安装ActiveMQ 及 spring boot 初步整合 activemq

    源码地址:  https://gitee.com/kevin9401/microservice.git 一.安装 ActiveMQ: 1. 下载 ActiveMQ wget  https://arch ...

  8. 『学了就忘』Linux服务管理 — 77、RPM包安装基于xinetd的服务的管理

    目录 1.基于xinetd服务的启动管理 (1)telnet服务安装 (2)telnet服务启动 2.基于xientd服务的自启动管理 现在Linux系统中基于xinetd的服务越来越少了,但Linu ...

  9. Windows FILETIME 与UNIX时间的转换

    windows FILETIME时间从1601/01/01 零时零分零秒开始计时,windows每个时钟滴答将计数加一,每个时钟滴答的间隔是100 nanoseconds(纳秒,1秒=10的九次方纳秒 ...

  10. (转)Zookeeper原理和作用

    本周末学习zookeeper,原理和安装配置 本文参考: http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/ http:/ ...