此文只是以最新版本作为示例,任意版本都可快速适配完人大金仓,基于我大国产数据库收费,当然就有技术支持,大可催官方出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)适配,无需过多折腾呢!