# 数据库操作
# 简要
系统集成目前集成了Dapper和EntityFramework Core(简称“EF”)进行数据操作。常用数据操作方法已在仓储基类BaseRepository提供。在BaseRepository我们提供EF上下文操作数据库DbContext
、
Dapper操作DapperContext
和DapperConn
。究竟是选择EF还是Dapper可以参考后面性能测试情况选择,下面介绍各种数据操作。
重要提示
BaseRepository是仓储实现基类,所有业务模块的仓储类都继承该基类。目前该类刚实现EF和Dapper的集成,有很多方法要做调整,建议开发者在各业务模块仓储实现自己的业务功能,方便平滑更新升级。
# 数据库连接配置
支持多类型、多个数据库访问,同时支持一主多从数据库读写分离。数据库连接配置在appsettings.json
中DbConnections
中,必须至少配置一个主数据库MasterDB
。
# 单数据库配置
配置一个主数据库MassterDB
即可,如下:
"DbConnections": {
"DefaultDb": {
"MasterDB": {
"ConnectionString": "Server=(local);Database=YBNF;User id=sa; password=Yuebon!23;MultipleActiveResultSets=True;", //主库
"DatabaseType": "SqlServer" //数据库类型
},
"ReadDb": []
}
}
其中:
1、ConnectionString指定数据库连接
2、DatabaseType指定数据库类型,目前支持的数据库类型值有MySql
、SqlServer
、Oracle
、SQLite
、Npgsql
,请注意区分大小写
# 多类型数据库配置
需配置多个MasterDB
,如下:
"DbConnections": {
"DefaultDb": {
"MasterDB": {
"ConnectionString": "Server=(local);Database=YBNF;User id=sa; password=Yuebon!23;MultipleActiveResultSets=True;", //主库
"DatabaseType": "SqlServer" //SqlServer数据库类型
},
},
"WcsDb": {
"MasterDB": {
"ConnectionString": "Server=(local);Database=YBNFwcs;User id=sa; password=Yuebon!23;MultipleActiveResultSets=True;", //主库
"DatabaseType": "MySql" //MySql数据库类型
},
}
}
# 多数据库配置
在项目中常常会使用到多个不同类型数据库,我们需要在对应的实体指定该实体对应哪个数据库。采用[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();
}
}
# dapper操作数据
Dapper操作数据库目前提供两种方式:
1)DapperConn:使用Dapper原生方法及扩展方法;更多Dapper使用方法参考Dapper
2)DapperContext:提供对Dapper方法的封装方法,所有方法在SqlDapper实现。
# EF操作数据
EF操作数据库在BaseRepository我们提供DbContext进行操作。EF的常用方法在IDbContextCore定义,并在BaseDbContext进行了通用方法的实现。 同时针对各类型数据库特性自实现了一些方法。
# 内置仓储
YuebonCore框架内置了一个数据库操作的仓储,方便大家拓展和集成:
IRepository:默认非泛型仓储接口,支持切换到任何仓储; BaseRepository:默认非泛型仓储实现。
每个业务模块仓储都将继承BaseRepository类。如下:
/// <summary>
/// 定时任务仓储接口的实现
/// </summary>
public class TaskManagerRepository : BaseRepository<TaskManager, string>, ITaskManagerRepository
{
public TaskManagerRepository()
{
}
/// <summary>
/// EF 数据操作注入
/// </summary>
/// <param name="context"></param>
public TaskManagerRepository(IDbContextCore context) : base(context)
{
}
}
# 多事务处理
# 单表批量操作
单表批量操作建议使用BulkInsert
方法
# 多表批量操作
多表数据操作推荐使用ExecuteTransaction()
或ExecuteTransactionAsync()
方法。
# EF 与Dapper性能测试
操作EF与dapper选择时推荐如下:
1)单条数据插入推荐使用EFAdd
方法;
2)单条数据更新推荐使用EFUpdate
方法;
- 单表分页推荐使用EFGetByPagination方法,复杂方法使用sql语句;
4)单个实体获取推荐使用Dapper的Get
方法;
5)MS Sql Server和Mysql批量插入推荐使用BulkInsert
方法,该方法目前是现在EF中DbContext调用。
6)在非MS sql sever数据库时,推荐Dapper。
欢迎更多开发者测试纠正。
题外话:
无论使用EF还是Dapper,对批量数据处理或复杂处理建议写原生Sql。
测试方法如下:
/// <summary>
/// 测试性能,建议删除
/// </summary>
/// <param name="len"></param>
/// <returns></returns>
public void InsertTset(int len)
{
int n = 0;
var sb = new StringBuilder(" EF 与Dapper常用方法性能分析 : \n");
Log logEntity1 = new Log()
{
Id = GuidUtils.GuId(),
Date = DateTime.Now,
Account = "admin",
NickName = "超级管理员",
OrganizeId = "2020101619392209546893",
Type = "SQL",
IPAddress = "171.110.40.191",
IPAddressName = "中国广西壮族自治区玉林市",
ModuleName = "Log",
Result = true,
Description = "SQL语句:update Sys_Role set EnabledMark=1 ,LastModifyUserId='2020100517554098226223',LastModifyTime=@LastModifyTime where id in ('2019091721053342871332')",
DeleteMark = false,
EnabledMark = true,
CreatorTime = DateTime.Now,
CreatorUserId = "9f2ec079-7d0f-4fe2-90ab-8b09a8302aba"
};
Log logEntity2 = new Log()
{
Id = GuidUtils.GuId(),
Date = DateTime.Now,
Account = "admin",
NickName = "超级管理员",
OrganizeId = "2020101619392209546893",
Type = "SQL",
IPAddress = "171.110.40.191",
IPAddressName = "中国广西壮族自治区玉林市",
ModuleName = "Log",
Result = true,
Description = "SQL语句:update Sys_Role set EnabledMark=1 ,LastModifyUserId='2020100517554098226223',LastModifyTime=@LastModifyTime where id in ('2019091721053342871332')",
DeleteMark = false,
EnabledMark = true,
CreatorTime = DateTime.Now,
CreatorUserId = "9f2ec079-7d0f-4fe2-90ab-8b09a8302aba"
};
Stopwatch stopwatch = new Stopwatch();
Stopwatch stopwatch1 = new Stopwatch();
Stopwatch stopwatch2 = new Stopwatch();
Stopwatch stopwatch3 = new Stopwatch();
Stopwatch stopwatch4 = new Stopwatch();
Stopwatch stopwatch5 = new Stopwatch();
Stopwatch stopwatch6 = new Stopwatch();
Stopwatch stopwatch7 = new Stopwatch();
Stopwatch stopwatch8 = new Stopwatch();
Stopwatch stopwatch9 = new Stopwatch();
Stopwatch stopwatch10 = new Stopwatch();
Stopwatch stopwatch11 = new Stopwatch();
Stopwatch stopwatch12 = new Stopwatch();
Stopwatch stopwatch13 = new Stopwatch();
Stopwatch stopwatch14 = new Stopwatch();
stopwatch.Start();
DapperContext.Add<Log>(logEntity1);
stopwatch.Stop();
sb.Append("Dapper 单条数据插入Insert耗时:" + (stopwatch.ElapsedMilliseconds + " 毫秒\n"));
stopwatch1.Start();
Add(logEntity2);
stopwatch1.Stop();
sb.Append("EF 单条数据插入Add耗时:" + (stopwatch1.ElapsedMilliseconds + " 毫秒\n"));
logEntity1.DeleteMark = false;
logEntity1.LastModifyTime = DateTime.Now;
logEntity2.DeleteMark = false;
logEntity2.LastModifyTime = DateTime.Now;
stopwatch2.Start();
Update(logEntity1);
stopwatch2.Stop();
sb.Append("Dapper 单条数据更新Update耗时:" + (stopwatch2.ElapsedMilliseconds + " 毫秒\n"));
stopwatch3.Start();
Edit(logEntity2);
stopwatch3.Stop();
sb.Append("EF 单条数据更新Edit耗时:" + (stopwatch3.ElapsedMilliseconds + " 毫秒\n"));
List<Log> logList = new List<Log>();
List<Log> logList2 = new List<Log>();
List<Log> logList3 = new List<Log>();
List<Log> logList4 = new List<Log>();
List<Log> logList5 = new List<Log>();
while (n < len.ToInt())
{
Log logEntity = new Log()
{
Id = GuidUtils.GuId(),
Date = DateTime.Now,
Account = "admin",
NickName = "超级管理员",
OrganizeId = "2020101619392209546893",
Type = "SQL",
IPAddress = "171.110.40.191",
IPAddressName = "中国广西壮族自治区玉林市",
ModuleName = "Log",
Result = true,
Description = "SQL语句:update Sys_Role set EnabledMark=1 ,LastModifyUserId='2020100517554098226223',LastModifyTime=@LastModifyTime where id in ('2019091721053342871332')",
DeleteMark = false,
EnabledMark = true,
CreatorTime = DateTime.Now,
CreatorUserId = "9f2ec079-7d0f-4fe2-90ab-8b09a8302aba"
};
logList.Add(logEntity);
Log logEntity3 = new Log()
{
Id = GuidUtils.GuId(),
Date = DateTime.Now,
Account = "admin",
NickName = "超级管理员",
OrganizeId = "2020101619392209546893",
Type = "SQL",
IPAddress = "171.110.40.191",
IPAddressName = "中国广西壮族自治区玉林市",
ModuleName = "Log",
Result = true,
Description = "SQL语句:update Sys_Role set EnabledMark=1 ,LastModifyUserId='2020100517554098226223',LastModifyTime=@LastModifyTime where id in ('2019091721053342871332')",
DeleteMark = false,
EnabledMark = true,
CreatorTime = DateTime.Now,
CreatorUserId = "9f2ec079-7d0f-4fe2-90ab-8b09a8302aba"
};
logList2.Add(logEntity3);
Log logEntity4 = new Log()
{
Id = GuidUtils.GuId(),
Date = DateTime.Now,
Account = "admin",
NickName = "超级管理员",
OrganizeId = "2020101619392209546893",
Type = "SQL",
IPAddress = "171.110.40.191",
IPAddressName = "中国广西壮族自治区玉林市",
ModuleName = "Log",
Result = true,
Description = "SQL语句:update Sys_Role set EnabledMark=1 ,LastModifyUserId='2020100517554098226223',LastModifyTime=@LastModifyTime where id in ('2019091721053342871332')",
DeleteMark = false,
EnabledMark = true,
CreatorTime = DateTime.Now,
CreatorUserId = "9f2ec079-7d0f-4fe2-90ab-8b09a8302aba"
};
logList3.Add(logEntity4);
Log logEntity5 = new Log()
{
Id = GuidUtils.GuId(),
Date = DateTime.Now,
Account = "admin",
NickName = "超级管理员",
OrganizeId = "2020101619392209546893",
Type = "SQL",
IPAddress = "171.110.40.191",
IPAddressName = "中国广西壮族自治区玉林市",
ModuleName = "Log",
Result = true,
Description = "SQL语句:update Sys_Role set EnabledMark=1 ,LastModifyUserId='2020100517554098226223',LastModifyTime=@LastModifyTime where id in ('2019091721053342871332')",
DeleteMark = false,
EnabledMark = true,
CreatorTime = DateTime.Now,
CreatorUserId = "9f2ec079-7d0f-4fe2-90ab-8b09a8302aba"
};
logList4.Add(logEntity5);
Log logEntity6 = new Log()
{
Id = GuidUtils.GuId(),
Date = DateTime.Now,
Account = "admin",
NickName = "超级管理员",
OrganizeId = "2020101619392209546893",
Type = "SQL",
IPAddress = "171.110.40.191",
IPAddressName = "中国广西壮族自治区玉林市",
ModuleName = "Log",
Result = true,
Description = "SQL语句:update Sys_Role set EnabledMark=1 ,LastModifyUserId='2020100517554098226223',LastModifyTime=@LastModifyTime where id in ('2019091721053342871332')",
DeleteMark = false,
EnabledMark = true,
CreatorTime = DateTime.Now,
CreatorUserId = "9f2ec079-7d0f-4fe2-90ab-8b09a8302aba"
};
logList5.Add(logEntity6);
n++;
}
string sql = "insert into Sys_Log ([Date], [Account], [NickName], [OrganizeId], [Type], [IPAddress], [IPAddressName], [ModuleId], [ModuleName], [Result], [Description], [DeleteMark], [EnabledMark], [CreatorTime], [CreatorUserId], [LastModifyTime], [LastModifyUserId], [DeleteTime], [DeleteUserId], [Id]) values (@Date, @Account, @NickName, @OrganizeId, @Type, @IPAddress, @IPAddressName, @ModuleId, @ModuleName, @Result, @Description, @DeleteMark, @EnabledMark, @CreatorTime, @CreatorUserId, @LastModifyTime, @LastModifyUserId, @DeleteTime, @DeleteUserId, @Id)";
stopwatch4.Start();
DbContext.BulkInsert<Log>(logList);
stopwatch4.Stop();
sb.Append("使用BulkInsert批量插入"+n+"条数据耗时:" + (stopwatch4.ElapsedMilliseconds + " 毫秒\n"));
stopwatch5.Start();
DbContext.AddRange<Log>(logList3);
stopwatch5.Stop();
sb.Append("EF 批量插入" + n + "条数据AddRange耗时:" + (stopwatch5.ElapsedMilliseconds + " 毫秒\n"));
using (IDbConnection conn = OpenSharedConnection())
{
stopwatch7.Start();
conn.Execute(sql, logList5);
stopwatch7.Stop();
sb.Append("Dapper 批量插入" + n + "条数据ExecuteAsync耗时:" + (stopwatch7.ElapsedMilliseconds + " 毫秒\n"));
}
List<Log> newlogList = new List<Log>();
foreach(Log item in logList)
{
Log info = new Log();
info = item;
info.LastModifyTime = DateTime.Now;
info.Description += item.Description + item.Description +"更新数据";
newlogList.Add(info);
}
Stopwatch stopwatch15 = new Stopwatch();
stopwatch15.Start();
Update(newlogList);
stopwatch15.Stop();
sb.Append("Dapper批量更新" + n + "条数据Update耗时:" + (stopwatch15.ElapsedMilliseconds + " 毫秒\n"));
stopwatch8.Start();
DbContext.EditRange<Log>(newlogList);
stopwatch8.Stop();
sb.Append("EF 批量更新" + n + "条数据EditRange耗时:" + (stopwatch8.ElapsedMilliseconds + " 毫秒\n"));
stopwatch9.Start();
Get(logEntity1.Id);
stopwatch9.Stop();
sb.Append("Dapper 查询单个实体Get耗时:" + (stopwatch9.ElapsedMilliseconds + " 毫秒\n"));
stopwatch10.Start();
DbContext.GetDbSet<Log>().Find(logEntity1.Id);
stopwatch10.Stop();
sb.Append("Ef查询单个实体Find耗时:" + (stopwatch10.ElapsedMilliseconds + " 毫秒\n"));
sql = $"select * from sys_Log where Id='" + logEntity1.Id + "'";
stopwatch11.Start();
DbContext.GetDbSet<Log>().FromSqlRaw<Log>(sql).FirstOrDefaultAsync<Log>();
stopwatch11.Stop();
sb.Append("Ef查询单个实体FromSqlRaw FirstOrDefaultAsync耗时:" + (stopwatch11.ElapsedMilliseconds + " 毫秒\n"));
PagerInfo pagerInfo = new PagerInfo
{
CurrenetPageIndex = 1,
PageSize = 50
};
stopwatch12.Start();
List<Log> list = FindWithPager("", pagerInfo, "CreatorTime", true);
PageResult<LogOutputDto> pageResult = new PageResult<LogOutputDto>
{
CurrentPage = pagerInfo.CurrenetPageIndex,
Items = list.MapTo<LogOutputDto>(),
ItemsPerPage = pagerInfo.PageSize,
TotalItems = pagerInfo.RecordCount
};
stopwatch12.Stop();
sb.Append("Dapper 分页查询耗时:" + (stopwatch12.ElapsedMilliseconds + " 毫秒\n"));
stopwatch13.Start();
List<Log> list2 = GetByPagination(m => true, pagerInfo, true).ToList<Log>();
PageResult<LogOutputDto> pageResult2 = new PageResult<LogOutputDto>
{
CurrentPage = pagerInfo.CurrenetPageIndex,
Items = list2.MapTo<LogOutputDto>(),
ItemsPerPage = pagerInfo.PageSize,
TotalItems = pagerInfo.RecordCount
};
stopwatch13.Stop();
sb.Append("EF 分页查询耗时:" + (stopwatch13.ElapsedMilliseconds + " 毫秒\n")); stopwatch.Start();
sql = $"select * from Sys_log";
string[] orderBys = { "CreatorTime desc" };
stopwatch14.Start();
PageResult<Log> list3 =DbContext.SqlQueryByPagination<Log>(sql, orderBys, 1,50);
stopwatch14.Stop();
sb.Append("EF 分页查询耗时:" + (stopwatch14.ElapsedMilliseconds + " 毫秒\n"));
Log4NetHelper.Info(sb.ToString());
}
测试结果如下:
[11:14:13] (Info) 方法名称:InsertTset
日志内容: EF 与Dapper常用方法性能分析 :
Dapper 单条数据插入Insert耗时:126 毫秒
EF 单条数据插入Add耗时:33 毫秒
Dapper 单条数据更新Update耗时:242 毫秒
EF 单条数据更新Edit耗时:184 毫秒
使用BulkInsert批量插入10条数据耗时:33 毫秒
EF 批量插入10条数据AddRange耗时:40 毫秒
Dapper 批量插入10条数据Insert批量耗时:823 毫秒
Dapper 批量插入10条数据ExecuteAsync耗时:1325 毫秒
Dapper批量更新10条数据Update耗时:2727 毫秒
EF 批量更新10条数据EditRange耗时:1 毫秒
Dapper 查询单个实体Get耗时:1004 毫秒
Ef查询单个实体Find耗时:157 毫秒
Ef查询单个实体FromSqlRaw FirstOrDefaultAsync耗时:12 毫秒
Dapper 分页查询耗时:1476 毫秒
EF 分页查询耗时:13 毫秒
EF 分页查询耗时:1320 毫秒
[11:15:08] (Info) 方法名称:InsertTset
日志内容: EF 与Dapper常用方法性能分析 :
Dapper 单条数据插入Insert耗时:61 毫秒
EF 单条数据插入Add耗时:29 毫秒
Dapper 单条数据更新Update耗时:197 毫秒
EF 单条数据更新Edit耗时:211 毫秒
使用BulkInsert批量插入10条数据耗时:35 毫秒
EF 批量插入10条数据AddRange耗时:43 毫秒
Dapper 批量插入10条数据Insert批量耗时:577 毫秒
Dapper 批量插入10条数据ExecuteAsync耗时:755 毫秒
Dapper批量更新10条数据Update耗时:2389 毫秒
EF 批量更新10条数据EditRange耗时:0 毫秒
Dapper 查询单个实体Get耗时:185 毫秒
Ef查询单个实体Find耗时:182 毫秒
Ef查询单个实体FromSqlRaw FirstOrDefaultAsync耗时:9 毫秒
Dapper 分页查询耗时:1439 毫秒
EF 分页查询耗时:14 毫秒
EF 分页查询耗时:1311 毫秒
[11:16:45] (Info) 方法名称:InsertTset
日志内容: EF 与Dapper常用方法性能分析 :
Dapper 单条数据插入Insert耗时:64 毫秒
EF 单条数据插入Add耗时:30 毫秒
Dapper 单条数据更新Update耗时:245 毫秒
EF 单条数据更新Edit耗时:201 毫秒
使用BulkInsert批量插入10条数据耗时:33 毫秒
EF 批量插入10条数据AddRange耗时:35 毫秒
Dapper 批量插入10条数据Insert批量耗时:982 毫秒
Dapper 批量插入10条数据ExecuteAsync耗时:636 毫秒
Dapper批量更新10条数据Update耗时:2091 毫秒
EF 批量更新10条数据EditRange耗时:0 毫秒
Dapper 查询单个实体Get耗时:167 毫秒
Ef查询单个实体Find耗时:186 毫秒
Ef查询单个实体FromSqlRaw FirstOrDefaultAsync耗时:11 毫秒
Dapper 分页查询耗时:3453 毫秒
EF 分页查询耗时:13 毫秒
EF 分页查询耗时:1576 毫秒
[11:18:16] (Info) 方法名称:InsertTset
日志内容: EF 与Dapper常用方法性能分析 :
Dapper 单条数据插入Insert耗时:275 毫秒
EF 单条数据插入Add耗时:1373 毫秒
Dapper 单条数据更新Update耗时:258 毫秒
EF 单条数据更新Edit耗时:497 毫秒
使用BulkInsert批量插入50条数据耗时:119 毫秒
EF 批量插入50条数据AddRange耗时:243 毫秒
Dapper 批量插入50条数据Insert批量耗时:4699 毫秒
Dapper 批量插入50条数据ExecuteAsync耗时:3690 毫秒
Dapper批量更新50条数据Update耗时:10699 毫秒
EF 批量更新50条数据EditRange耗时:2 毫秒
Dapper 查询单个实体Get耗时:177 毫秒
Ef查询单个实体Find耗时:146 毫秒
Ef查询单个实体FromSqlRaw FirstOrDefaultAsync耗时:5 毫秒
Dapper 分页查询耗时:1621 毫秒
EF 分页查询耗时:22 毫秒
EF 分页查询耗时:1386 毫秒
[11:19:54] (Info) 方法名称:InsertTset
日志内容: EF 与Dapper常用方法性能分析 :
Dapper 单条数据插入Insert耗时:55 毫秒
EF 单条数据插入Add耗时:35 毫秒
Dapper 单条数据更新Update耗时:254 毫秒
EF 单条数据更新Edit耗时:168 毫秒
使用BulkInsert批量插入50条数据耗时:33 毫秒
EF 批量插入50条数据AddRange耗时:120 毫秒
Dapper 批量插入50条数据Insert批量耗时:3805 毫秒
Dapper 批量插入50条数据ExecuteAsync耗时:3220 毫秒
Dapper批量更新50条数据Update耗时:11072 毫秒
EF 批量更新50条数据EditRange耗时:2 毫秒
Dapper 查询单个实体Get耗时:211 毫秒
Ef查询单个实体Find耗时:282 毫秒
Ef查询单个实体FromSqlRaw FirstOrDefaultAsync耗时:6 毫秒
Dapper 分页查询耗时:1450 毫秒
EF 分页查询耗时:13 毫秒
EF 分页查询耗时:1316 毫秒
[11:21:19] (Info) 方法名称:InsertTset
日志内容: EF 与Dapper常用方法性能分析 :
Dapper 单条数据插入Insert耗时:184 毫秒
EF 单条数据插入Add耗时:37 毫秒
Dapper 单条数据更新Update耗时:258 毫秒
EF 单条数据更新Edit耗时:253 毫秒
使用BulkInsert批量插入50条数据耗时:34 毫秒
EF 批量插入50条数据AddRange耗时:157 毫秒
Dapper 批量插入50条数据Insert批量耗时:7365 毫秒
Dapper 批量插入50条数据ExecuteAsync耗时:4021 毫秒
Dapper批量更新50条数据Update耗时:11607 毫秒
EF 批量更新50条数据EditRange耗时:49 毫秒
Dapper 查询单个实体Get耗时:155 毫秒
Ef查询单个实体Find耗时:185 毫秒
Ef查询单个实体FromSqlRaw FirstOrDefaultAsync耗时:244 毫秒
Dapper 分页查询耗时:1383 毫秒
EF 分页查询耗时:58 毫秒
EF 分页查询耗时:1759 毫秒
[11:21:40] (Info) 方法名称:InsertTset
日志内容: EF 与Dapper常用方法性能分析 :
Dapper 单条数据插入Insert耗时:128 毫秒
EF 单条数据插入Add耗时:72 毫秒
Dapper 单条数据更新Update耗时:215 毫秒
EF 单条数据更新Edit耗时:254 毫秒
使用BulkInsert批量插入50条数据耗时:402 毫秒
EF 批量插入50条数据AddRange耗时:333 毫秒
Dapper 批量插入50条数据Insert批量耗时:17727 毫秒
Dapper 批量插入50条数据ExecuteAsync耗时:4437 毫秒
Dapper批量更新50条数据Update耗时:10654 毫秒
EF 批量更新50条数据EditRange耗时:5 毫秒
Dapper 查询单个实体Get耗时:156 毫秒
Ef查询单个实体Find耗时:170 毫秒
Ef查询单个实体FromSqlRaw FirstOrDefaultAsync耗时:9 毫秒
Dapper 分页查询耗时:1464 毫秒
EF 分页查询耗时:16 毫秒
EF 分页查询耗时:1451 毫秒
[12:14:42] (Info) 方法名称:InsertTset
日志内容: EF 与Dapper常用方法性能分析 :
Dapper 单条数据插入Insert耗时:141 毫秒
EF 单条数据插入Add耗时:30 毫秒
Dapper 单条数据更新Update耗时:236 毫秒
EF 单条数据更新Edit耗时:184 毫秒
使用BulkInsert批量插入10条数据耗时:36 毫秒
EF 批量插入10条数据AddRange耗时:37 毫秒
Dapper 批量插入10条数据Insert批量耗时:578 毫秒
Dapper 批量插入10条数据ExecuteAsync耗时:605 毫秒
Dapper批量更新10条数据Update耗时:2157 毫秒
EF 批量更新10条数据EditRange耗时:0 毫秒
Dapper 查询单个实体Get耗时:162 毫秒
Ef查询单个实体Find耗时:164 毫秒
Ef查询单个实体FromSqlRaw FirstOrDefaultAsync耗时:5 毫秒
Dapper 分页查询耗时:1438 毫秒
EF 分页查询耗时:18 毫秒
EF 分页查询耗时:1295 毫秒
# 读写分离
目前还未实现,已列入开发计划。
# 反馈与建议
与我们交流
给 YuebonCore
提 Issue。