数据库操作
简要
系统集成目前集成了 Dapper 和 EntityFramework Core(简称“EF”)进行数据操作。常用数据操作方法已在仓储基类 BaseRepository 提供。在 BaseRepository 我们提供 SqlSugar 对数据库操作,下面介绍各种数据操作。
重要提示
BaseRepository 是仓储实现基类,所有业务模块的仓储类都继承该基类。建议开发者在各业务模块仓储实现自己的业务功能,方便平滑更新升级。
数据库连接配置
支持多类型、多个数据库访问,同时支持一主多从数据库读写分离。数据库连接配置在appsettings.json
中DbConnections
中,必须至少配置一个主数据库MasterDB
。
单数据库配置
配置一个主数据库MassterDB
即可,如下:
"DbConnections": [
{
"ConnId": "DefaultDb",
"Enabled": true,
"MasterDB": { //必须配置,远程服务器数据库
"ConnectionString": "server=127.0.0.1;database=ybnf1;user=root;CharSet=utf8;password=123456;port=3306;CharSet=utf8mb4;Allow User Variables=True;SslMode=none;AllowLoadLocalInfile=true;",
"DatabaseType": 0, //数据库类型
"Enabled": true //是否可用
},
"ReadDB": []
}
]
其中:
1、ConnectionString 指定数据库连接
2、DatabaseType 指定数据库类型,需要注意DatabaseType
指定数据库类型,目前支持的数据库类型值有 mysql=0,SqlServer=1,Oracle=2,Access=3,SQLite=4,PostgreSQL=5,Npgsql=6,Dm=7,Kdbndp=8。
3、MassterDB 为主数据库配置信息,在不开启读写分离的情况下,仅配置该参数即可。
多类型数据库配置
需配置多个MasterDB
,如下:
"DbConnections": [
{
"ConnId": "DefaultDb",
"Enabled": true,
"MasterDB": { //必须配置,远程服务器数据库
"ConnectionString": "server=127.0.0.1;database=ybnf1;user=root;CharSet=utf8;password=123456;port=3306;CharSet=utf8mb4;Allow User Variables=True;SslMode=none;AllowLoadLocalInfile=true;",
"DatabaseType": 0, //数据库类型
"Enabled": true //是否可用
},
"ReadDB": []
},
{
"ConnId": "LocalDB",
"Enabled": true,
"MasterDB": { //本地数据库
"ConnectionString": "server=localhost;Database=bonwcslocal1;Uid=root;Pwd=123456;Port=3306;CharSet=utf8mb4;Allow User Variables=True;SslMode=none;AllowLoadLocalInfile=true;",
"DatabaseType": 0, //数据库类型
"Enabled": true //是否可用
},
"ReadDB": [
{
"ConnectionString": "", //数据库连接字符
"HitRate": "", //从库执行访问权重,越大越先执行
"Enabled": true //是否可用
},
{
"ConnectionString": "", //数据库连接字符
"HitRate": "", //从库执行访问权重,越大越先执行
"Enabled": true //是否可用
}
]
}
]
多数据库配置
在项目中常常会使用到多个不同类型数据库,我们需要在对应的实体指定该实体对应哪个数据库。采用[AppDBContext("xxx")]
属性进行标记。xxx 即为数据库配置连接字符串名称。
/// <summary>
/// 系统日志,数据实体对象
/// </summary>
[AppDBContext("MsSqlServerCode")]
[Table("Sys_Log")]
[Serializable]
public class Log: BaseEntity<string>, ICreationAudited, IModificationAudited, IDeleteAudited
{
/// <summary>
/// 默认构造函数(需要初始化属性的在此处理)
/// </summary>
public Log()
{
this.Id = GuidUtils.CreateNo();
}
}
内置仓储
YuebonCore 框架内置了一个数据库操作的仓储,方便大家拓展和集成:
IRepository:默认非泛型仓储接口,支持切换到任何仓储; BaseRepository:默认非泛型仓储实现。
每个业务模块仓储都将继承 BaseRepository 类。如下:
/// <summary>
/// 定时任务仓储接口的实现
/// </summary>
public class TaskManagerRepository : BaseRepository<TaskManager>, ITaskManagerRepository
{
/// <summary>
/// EF 数据操作注入
/// </summary>
/// <param name="context"></param>
public TaskManagerRepository(IDbContextCore context) : base(context)
{
}
}
多事务处理
单表批量操作
单表批量操作建议使用BulkInsert
方法
多表批量操作
多表数据操作推荐使用ExecuteTransaction()
或ExecuteTransactionAsync()
方法。
读写分离
开启配置
修改 Yuebon.WebApp/appsettings.json 中的 AppSetting 配置,设置 IsDBReadWriteSeparate 为 true 开启数据库读写分离,默认为 false,不开启。如下:
"AppSetting": {
"SoftName": "YueBonCore Framework",
"CertificatedCompany": "Yuebon",
"ConStringEncrypt": "false",//连接字符串是否加密
"DefaultDataBase": "DefaultDb",//默认数据库连接
"IsDBReadWriteSeparate": false, //开启数据库读写分离
"QueryDBStrategy": "Random", //定义多个从数据库的访问策略
},
从数据库配置
在数据库连接配置中配置 ReadDB 即可。其中 HitRate 是从库执行访问权重,越大越先执行。
"DbConnections": [
{
"ConnId": "LocalDB",
"Enabled": true,
"MasterDB": { //本地数据库
"ConnectionString": "server=localhost;Database=bonwcslocal1;Uid=root;Pwd=123456;Port=3306;CharSet=utf8mb4;Allow User Variables=True;SslMode=none;AllowLoadLocalInfile=true;",
"DatabaseType": 0, //数据库类型
"Enabled": true //是否可用
},
"ReadDB": [
{
"ConnectionString": "", //数据库连接字符
"HitRate": "", //从库执行访问权重,越大越先执行
"Enabled": true //是否可用
},
{
"ConnectionString": "", //数据库连接字符
"HitRate": "", //从库执行访问权重,越大越先执行
"Enabled": true //是否可用
}
]
}
]
反馈与建议
与我们交流 给 YuebonCore
提 Issue。