WTM 的项目中 EFCore 如何适配人大金仓数据库
一、WTM 是什么
WalkingTec.Mvvm 框架(简称 WTM)最早开发与 2013 年,基于 Asp.net MVC3 和 最早的 Entity Framework, 当初主要是为了解决公司内部开发效率低,代码风格不统一的问题。2017 年 9 月,将代码移植到了.Net Core 上,并进行了深度优化和重构,推出了基于 Asp.net Core 和 EF Core 的全新框架,新框架在架构,稳定性,速度上都有长足进步,真正成为一款高效开发的利器。经历了四年间数十个项目的考验,框架逐步的完善,推出了四个主要版本。WTM 框架设计的核心理念就是”尽一切可能提高开发效率“。
WTM 框架把常规编码结构化,重复编码自动化,它不仅是一个框架,它是强有力的生产力工具!在不分离的模式下,它连通了前台 UI 和后台代码。你不需要前后台分离,不需要两个人配合,减少成本,缩短工期。在前后端分离的模式下,同样可以使用代码生成器同时生成前台和后台的代码,极大的降低了前后端人员的沟通成本,从本质上提升了开发效率,让“分离”不再复杂和昂贵。
框架特点:一键生成 WTM 项目一键生成增删改查,导入导出,批量操作代码支持一对多,多对多关联模型的识别和代码生成支持 React+AntD,Vue+Element,LayUI,Blazor 等多种前端模式支持 sqlserver,mysql,pgsql,sqlite,Oracle 等多种数据库封装了 Layui,AntD,Element 的大部分控件,编写前台更加简便提供了很多基类,封装了绝大部分后台常用操作提供了用户,角色,用户组,菜单,日志等常用模块支持数据权限的开发和配置支持读写分离和数据库分库
开源地址:(GitHub) https://github.com/WalkingTec/WalkingTec.Mvvm(Gitee) https://gitee.com/liuliang-wtm/WTM
二、人大金仓是什么
人大金仓数据库管理系统[简称:KingbaseES]是北京人大金仓信息技术股份有限公司[简称人大金仓]的核心产品,具有大型通用、"三高"(高可靠、高性能、高安全)、"三易"(易管理、易使用、易扩展)、运行稳定等特点,是唯一入选国家自主创新产品目录的数据库产品,也是国家级、省部级实际项目中应用最广泛的国产数据库产品。
人大金仓数据库管理系统 KingbaseES(KES) 是面向全行业、全客户关键应用的企业级大型通用数据库管理系统,适用于联机事务处理、查询密集型数据仓库、要求苛刻的互联网应用等场景,提供全部应用开发及系统管理功能,提供性能增强特性,可支持主备集群、读写分离集群、多活共享存储集群等全集群架构,具有高性能、高安全、高可用、易使用、易管理、易维护的特点,支持所有国内外主流 CPU、操作系统与云平台部署。
下载试用地址:https://www.kingbase.com.cn/xzzx/index.htm可在下载页面申请开发试用授权文件,授权时间 365 天。安装过程比较简单,唯一需要注意的就是在安装过程中可以选择数据库兼容类型,这里选择的是 UTF8 字符集,兼容 MySql,大小写不敏感。
![](https://static001.geekbang.org/infoq/d2/d2ee7f32527a7aa580cdb1ad7fd283a6.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
三、迁移注意事项
项目用的是.NET6 框架,在项目里引用(或者 NuGet 安装)人大金仓官方的 EFCore 的 Kdbndp 驱动 Kdbndp.EntityFrameworkCore6.KingbaseES。
![](https://static001.geekbang.org/infoq/6e/6ec0514be5801261e175eb1211353fda.png)
1、工作流使用的数据库所属模式手动创建
WTM 集成了 Elsa 的工作流,在迁移的过程中需要把 Elsa 所需要的几个表迁移到特定的模式下面,否则运行会提示找不到 Elsa.xxxx 的错误提示;
模式右键-->新建-->Elsa,然后把所需要的这几个表迁移到它下面。
![](https://static001.geekbang.org/infoq/ca/ca09c0ba47300de87de2c9436d3c5530.png)
2、字段类型转换
绝大部分的 Mysql 字段可以无缝迁移到人大金仓,对于 mysql 的 bool 类型的字段需要特别关注一下,会迁移成 bit 或者 int 类型,需要手动调整成人大金仓的 bool 类型;
mysql 的 datetime 类型,迁移到人大金仓后对应的类型是 timestamp。这个需要在 DataContext 的 OnConfiguring 中指定一下参数,否则会报以下错误:
System.InvalidCastException: Cannot write DateTime with Kind=Local to PostgreSQL type 'timestamp with time zone', only UTC is supported. Note that it's not possible to mix DateTimes with different Kinds in an array/range. See the Npgsql.EnableLegacyTimestampBehavior AppContext switch to enable legacy behavior.
具体参考:https://www.npgsql.org/doc/types/datetime.html#timestamps-and-timezones
3、自增字段实现
在 mysql、sqlserver 等数据库中,只要把字段设置为 int,然后打开自增选项后,字段就会实现自增功能。在人大金仓中,默认没有这种字段类型,官网中称这种为序数类型,类似于 Oracle 的 SEQUENCE:
smallserial、serial 和 bigserial 类型不是真正的类型, 它们只是为了创建唯一标识符列而存在的方便符号(类似其它一些数据库中支持的 AUTO_INCREMENT 属性)。 这是 KingbaseES 特有的创建一个自增列的方法。
因为 smallserial、serial 和 bigserial 是用序列实现的,所以即使没有删除过行,在出现在列中的序列值可能有“空洞”或者间隙。如果一个从序列中分配的值被用在一行中,即使该行最终没有被成功地插入到表中,该值也被“用掉”了。例如,当插入事务回滚时就会发生这种情况。更多信息参见序列操作函数中的 nextval()。
在人大金仓中需要通过序列类型实现字段自增的方式,需要我们在数据库的 Public 模式下的序列中,创建一个序列(这里设置的最大值为 bigint 的最大值附近,具体可自己决定):
![](https://static001.geekbang.org/infoq/7e/7e35a4d9b1607781269c594b5fb85895.png)
![](https://static001.geekbang.org/infoq/6d/6d6f34197dc15cf7e8a2a338313b8418.png)
随后,在需要自增的字段,给它的默认值设置为 nextval('USER_SEQUENCE'::regclass) ,这样在每次 insert 数据的时候,这个字段会自动从序列中获取最新的值来填充(不需要代码中进行赋值)。
![](https://static001.geekbang.org/infoq/26/26bd96cb5a4975d54d51b8d44c0172e8.png)
至此就基本完成了 mysql 到人大金仓的数据库迁移。
文章转载自:踏平扶桑
评论