EF Core 的全称是 Entity Framework Core。它是微软官方推出的一个开源、轻量级、可扩展的 ORM 框架。简单来说,ORM 让你可以像操作普通 C# 对象一样来操作数据库,而不用写繁琐的 SQL 语句。想象一下,数据库是一个巨大的图书馆,书放在哪里、怎么分类(SQL)你需要很专业。而 EF Core 就像是你的专属图书管理员。你只需要对他说:“帮我拿所有价格大于 10 块的书(C# 代码)”,他就会帮你把书找到并拿给你,你完全不用关心他是怎么在书架上找到这些书的。
Microsoft.EntityFrameworkCore:.NET 平台上一个官方、开源的 ORM 框架的核心库,它让你能用操作对象(C#类)的方式而不是写SQL语句来高效地访问数据库。
DM Provider:特指 达梦数据库(DM) 用于连接和操作数据库的官方驱动程序。它就像是达梦数据库和你的应用程序之间的一座专用桥梁。
这里我们选择efcore3.1版本适配8.1.4.6版本达梦。
Nuget上的驱动包由达梦研发人员不定时上传,使用NuGet包管理工具,可以在nuget上下载安装Microsoft.EntityFrameworkCore和DM Provider。
nuget上下载安装Microsoft.EntityFrameworkCore,选中项目右键选择管理nuget程序集,如下:
搜索Microsoft.EntityFrameworkCore,右边选择3.1版本下载安装
nuget上下载安装DM Provider
安装后我们就能在依赖项中看到我们从nuget上下载安装的核心库及驱动
为什么推荐手动引用本地驱动呢?因为Nuget上的驱动包由达梦研发不定时上传,可能不是最新的驱动,这可能会引发一些旧版本驱动未修复的问题,所以建议本地引用数据库版本对应的核心库文件以及驱动。
本地如何引用,进入nuget管理程序包,选中右上方设置,然后设置程序包源,引用本地的库文件和驱动包即可。
本地选择驱动包
这样我们就可以在程序包源处选择我们本地需要引用的包
Vs安装略vs下载链接,本地安装的是vs2022社区版本。
新建一个项目DMTest,项目实现的在web平台保存数据写进达梦数据库。
相关代码见附件
创建测试表
CREATE TABLE "SYSDBA"."DMTEST"
(
"ID" VARCHAR(200) NOT NULL,
"NAME" VARCHAR(50) NOT NULL,
"CREATETIME" DATETIME(6)) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE UNIQUE INDEX "SYSDBA"."PK_ID" ON "SYSDBA"."DMTEST"("ID" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
附件解压,使用vs打开程序并设置启动项为DMTest,运行
通过DMTest.exe运行程序提示,浏览器打开http://127.0.0.1:6001/如下:
随机输入一条数据,数据类型要和建表时的name字段数据类型一致即可,点击保存,然后继续运行程序
然后进数据库查询是否保存了这条数据,保存成功
在项目上我们使用efcore适配达梦过程中,遇到了一些问题,4.1-4.2都是驱动引起的问题,以下是相关问题描述及处理方法。
项目上开始使用的是3.1.0.27907版本dmprovider驱动连接数据库,驱动版本存在4.2的问题,所以更换了3.1.0.33671版本驱动,但是出现了在并发写入数据时会报错Already enlisted已经注册,报错如下:
和研发同事沟通确认,当程序中存在嵌套事务的时候并发写入会报错,老版本驱动不报错是因为有些功能不支持才不报错,新版本驱动报错是因为支持更多功能从而引发这个报错,因此等研发修改完驱动后更换版本为3.1.0.35345,问题解决。
efcore使用DM.Microsoft.EntityFrameworkCore(3.1.0.33671)版本驱动连接达梦,保存数据到表中报错违反引用约束报错如下
跟研发沟通确认该问题,环境事务下应该支持外键约束插入,实际使用时报错违反约束。修改DmConnection.do_EnlistTransaction逻辑,实现同Transaction下相同连接串复用同一ConnInstance的功能。更换研发同事提供的驱动版本问题解决。
efcore连接达梦,应用服务运行一段时间后,服务挂掉,前端访问不了MES系统。排查服务挂掉前的日志,报错日志如下
根据系统挂掉的时间,从达梦驱动日志找到了对应的报错记录,报错信息如下:
怀疑是驱动的异步方法没有处理异常导致的系统崩溃,这个问题也是偶发的,无法复现,项目中也没办法定位对应的代码。
将信息收集后提交研发同事,定位到是嵌套事务并发引起的空引用报错,更改过驱动后,申请新版本驱动问题解决,但是出现了串行化事务被打断的新问题,研发表示这可能与业务逻辑有关,收集sqllog日志后发现有更改事务隔离级别的代码逻辑,反馈后更改代码逻辑问题解决。
Efcore连接达梦在使用过程中,出现了大量空闲会话且无法回收导致连接数满了影响生产,关闭连接池可以绕过问题,问题出现后暂时使用绕过方法。
根据连接参数和日志定位到是由于参数设置导致,只设置了connPoolIdleExpiredTime并未设connPoolIdleClearInterval这个参数可能会导致空闲连接无法回收的问题,在连接池上增加connPoolIdleClearInterval参数设置后(connPoolIdleClearInterval值要大于connPoolIdleExpiredTime值),问题解决。
文章
阅读量
获赞