.NET 5 ORM 八大实用技巧 干货 - SqlSugar ORM
介绍
sqlsugar已经在第一时间完美兼容.NET5并且已经有人在使用了, 很多人都担心用了开源框架遇到问题无法解决,导致前功尽弃,使用SqlSugar你大可放心,除了有详细文档和几年的大量用户积累,
SqlSugar还提供了完整的服务,让您的项目没有后顾之忧
优点: 简单易用、功能齐全、高性能、轻量级、服务齐全
支持数据库:MySql、SqlServer、Sqlite、Oracle 、 postgresql、达梦、人大金仓
免费服务
1、基本用法咨询
2、BUG提交
3、采纳建议和需求
4、代码开源 可用于任何商用项目 不收取费用 下载
5、qq交流群讨论 995692596(空闲) 654015377(1800/2000 拥挤) 726648662((已满) 225982985 (已满)
实践技巧1 :性能监控
通过该功能我们能轻松的监控到执行超过1秒的sql,并且可以拿 到他的 C#代码文件和行数 和方法
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
DbType = DbType.SqlServer,
ConnectionString = Config.ConnectionString,
InitKeyType = InitKeyType.Attribute,
IsAutoCloseConnection = true });
db.Aop.OnLogExecuted = (sql, p) =>
{
//执行时间超过1秒
if (db.Ado.SqlExecutionTime.TotalSeconds > 1)
{
//代码CS文件名
var fileName= db.Ado.SqlStackTrace.FirstFileName;
//代码行数
var fileLine = db.Ado.SqlStackTrace.FirstLine;
//方法名
var FirstMethodName = db.Ado.SqlStackTrace.FirstMethodName;
//db.Ado.SqlStackTrace.MyStackTraceList[1].xxx 获取上层方法的信息
}
};
实践功能2:数据变化监控
当我们的代码删了哪具体的代码,添加了具体的代码,修改了哪个列如果没有强大的日志功能将你将无法找回,SqlSugar可以轻松实现高安全级别的数据日志
db.Aop.OnDiffLogEvent = it =>
{
var editBeforeData = it.BeforeData;//操作前记录 包含: 字段描述 列名 值 表名 表描述
var editAfterData = it.AfterData;//操作后记录 包含: 字段描述 列名 值 表名 表描述
var sql = it.Sql;
var parameter = it.Parameters;
var data = it.BusinessData;//这边会显示你传进来的对象
var time = it.Time;
var diffType=it.DiffType;//enum insert 、update and delete //Write logic
}; //添加
db.Insertable(new Student() { Name = "beforeName" })
.EnableDiffLogEvent(new { title="我是插入"}) //启用日志并添加业务对象
.ExecuteReturnIdentity();
//修改
db.Updateable<Student>(new Student()
{
Id = id,
CreateTime = DateTime.Now,
Name = "afterName",
SchoolId = 2
})
.EnableDiffLogEvent() //启动日志
.ExecuteCommand();
//删除
db.Deleteable<Student>(id)
.EnableDiffLogEvent()//启动日志
.ExecuteCommand();
实践功能3:JSON类型完美支持
SqlSugar不但支持PgSql的Json array类型外,哪怕你的数据库没有JSON类型一样可以使用JSON对象进行存储
ublic class UnitJsonTest
{
[SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
[SqlSugar.SugarColumn(ColumnDataType ="varchar(max)", IsJson = true)]
public Order Order { get; set; }
public string Name{get;set;}
}
Db.Insertable(new UnitJsonTest() { Name="json1",Order = new Order { Id = 1, Name = "order1" } }).ExecuteCommand();
var list = Db.Queryable<UnitJsonTest>().ToList();
实践功能4:分库+分表+多库事务
1、动态创建数据库
下面代码将会创建db1和db2数据库
string conn = "server=.;uid=sa;pwd=haosql;database={0}";
var db = new SqlSugarClient(new ConnectionConfig()
{
DbType = SqlSugar.DbType.SqlServer,
ConnectionString = string.Format(conn, "db1"),
InitKeyType=InitKeyType.Attribute
});
db.DbMaintenance.CreateDatabase();
var db2 = new SqlSugarClient(new ConnectionConfig()
{
DbType = SqlSugar.DbType.SqlServer,
ConnectionString = string.Format(conn, "db2")
});
db2.DbMaintenance.CreateDatabase();
2、动态建表
下面代码将生成生Order1和Order2 两张表 //注意db必须是同一个上下文
var db = new SqlSugarClient(new ConnectionConfig()
{
DbType = SqlSugar.DbType.SqlServer,
ConnectionString = ".;xxx",
InitKeyType=InitKeyType.Attribute //这个属性必须这么设置 }); db.MappingTables.Add(typeof(Order).Name, typeof(Order).Name + 1);
db.CodeFirst.InitTables(typeof(Order));
db.MappingTables.Add(typeof(Order).Name, typeof(Order).Name + 2);
db.CodeFirst.InitTables(typeof(Order));
3、实体增、删、查、改
var list= db.Queryable<Order>().AS("Order1").ToList();//查询Order1的表
//增 删 改用法和查询一样 Inasertable().AS Deleteable().AS Updateable().As
4、跨库联表查询
var list = db.Queryable<Order, OrderItem, Custom>((o, i, c) => o.Id == i.OrderId&&c.Id == o.CustomId)
.AS("xx.order")
.AS<OrderItem>("yy.OrderItem")
.AS<Custom>("zz.Custom")
.Select<ViewOrder>()
.ToList();
5、多切换
SqlSugarClient db = new SqlSugarClient(new List<ConnectionConfig>()
{
new ConnectionConfig(){ ConfigId="1", DbType=DbType.SqlServer,
ConnectionString=Config.ConnectionString,InitKeyType=InitKeyType.Attribute,IsAutoCloseConnection=true },
new ConnectionConfig(){ ConfigId="2", DbType=DbType.MySql,
ConnectionString=Config.ConnectionString4 ,InitKeyType=InitKeyType.Attribute ,IsAutoCloseConnection=true}
}); //库1
try
{
db.BeginTran();
db.Deleteable<Order>().ExecuteCommand(); db.ChangeDatabase("2");//使用库2
db.Deleteable<Order>().ExecuteCommand(); db.CommitTran();
}
catch
{
db.RollbackTran();
}
实践功能5:无限级别的级联插入
使用sqlsugar只需要配置主键,不需要实体配置任何外键关系就能实现级联插入
//有自动赋值的外键
db.Insertable(new Order()
{
Name = "订单 1",
CustomId = 1,
Price = 100,
CreateTime = DateTime.Now,
Id = 0,//自增列
Items = new List<OrderItem>() {
new OrderItem(){
CreateTime=DateTime.Now,
OrderId=0,//需要自动获取订单的自增列
Price=1,
ItemId=1
}
}
})
.AddSubList(it => it.Items.First().OrderId )//设置item表的OrderId等于订单自增列
.ExecuteReturnPrimaryKey();
实践功能6:全自动二级缓存
当我们用到Redis等操作时,更新数据时需要及时去清理缓存会变的非常复杂,SqlSugar支持多表缓存,并且更新其中一张表并且能够清除缓存
二缓缓存是将结果集进行缓存,当SQL和参数没发生变化的时候从缓存里面读取数据,减少数据库的读写操作
ICacheService myCache = new HttpRuntimeCache();
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = Config.ConnectionString,
DbType = DbType.SqlServer,
IsAutoCloseConnection = true,
ConfigureExternalServices = new ConfigureExternalServices()
{
DataInfoCacheService = myCache //配置我们创建的缓存类
}
});
db.Queryable<Student>().Where(it => it.Id > 0).WithCache().ToList();//设置缓存默认一天
db.Queryable<Student>().WithCache(1000).ToList();//设置具体过期时间
删除数据同时更新缓存,插入用和更新也一样的用法
db.Deleteable<Student>().RemoveDataCache().Where(it => it.Id == 1).ExecuteCommand(); //remove所有引用Student表的缓存,包含多表查询
实践功能7:支持对数据库的多种操作
| 名称 | 备注 | 返回类型 |
|---|---|---|
| GetDataBaseList | 获取所有数据库名称 | List |
| GetViewInfoList | 获取所有视图 | List |
| GetTableInfoList | 获取所有表 | List |
| GetColumnInfosByTableName | 获取列根据表名 | List |
| GetIsIdentities | 获取自增列 | List |
| GetPrimaries | 获取主键 | List |
| IsAnyTable | 表是否存在 | bool |
| IsAnyColumn | 列是否存在 | bool |
| IsPrimaryKey | 主键是否存在 | bool |
| IsIdentity | 自增是否存在 | bool |
| IsAnyConstraint | 约束是否存在 | bool |
| DropTable | 删除表 | bool |
| TruncateTable | 清空表 | bool |
| CreateTable | 创建列(不建议使用,用CodeFirst建表) | bool |
| AddColumn | 添加列 | bool |
| UpdateColumn | 更新列 | bool |
| AddPrimaryKey | 添加主键 | bool |
| DropConstraint | 删除约束 | bool |
| BackupDataBase | 备份库 | bool |
| DropColumn | 删除列 | bool |
| RenameColumn | 重命名列 | bool |
| AddTableRemark | 添加表描述 | bool |
| AddColumnRemark | 添加列描述 | bool |
| DeleteColumnRemark | 删除列描述 | bool |
| RenameTable | 重命名表 | bool |
实践功能8:动态SQL完美防注入方案
var orderField = "order';drop table order";
var orderInfo= db.EntityMaintenance.GetEntityInfo<Order>();
if (orderInfo.Columns.Any(it => it.DbColumnName != orderField))
{
throw new Exception("请不要非法注入");
}
db.Queryable<Order>().OrderBy(orderField).ToList();
SqlSugar一直在努力的变的更好,所有功能都是来自客户并且经受过长期的用户实践,为了能够给我更多动力
原码下载: https://github.com/sunkaixuan/SqlSugar 只需你点赞,让我动力十足
.NET 5 ORM 八大实用技巧 干货 - SqlSugar ORM的更多相关文章
- js基础进阶--编的实用技巧(一)
我的个人博客:http://www.xiaolongwu.cn 在平时的开发中,编码技巧很重要,会让你少写很多代码,起到事倍功半的效果. 下面总结几种简单的技巧,大家共同学习一下 1. 利用+.-./ ...
- Notepad++ 实用技巧
Notepad++是一款开源的文本编辑器,功能强大.很适合用于编辑.注释代码.它支持绝大部分主流的编程语言. 本文主要列举了本人在实际使用中遇到的一些技巧. 快捷键 自定义快捷键 首先,需要知道的是: ...
- javascript实用技巧、javascript高级技巧
字号+作者:H5之家 来源:H5之家 2016-10-31 11:00 我要评论( ) 三零网提供网络编程. JavaScript 的技术文章javascript实用技巧.javascript高级技巧 ...
- SqlSugar ORM已经支持读写分离
目前只有MYSQL版 3.5.2.9 支持,其库版本12月3号更新该功能 用例讲解 using (var db = new SqlSugarClient("主连接字符串", &qu ...
- Dapper ORM VS SqlSugar ORM的 8场对决
CUP和.NET SQL版本不同也会存在少许差距,但不会有质变,下面的测试结果仅供参考 比赛规则 1.统一使用Realse版本的最新 DLL,Realse模式启用程序 2.为了平衡CPU和数据库空闲情 ...
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...
- iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示
iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示 本文介绍其简单使用: 第一步:在本地建立一个访问的服务端. 打开本地终端,在本地新建一个文件夹,在该文件夹中存放测试的html页面. ...
- iOS开发实用技巧—项目新特性页面的处理
iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性 ...
- IOS 网络浅析-(十三 SDWebImage 实用技巧)
IOS 网络浅析-(十三 SDWebImage 实用技巧) 首先让我描述一下为了什么而产生的实用技巧.(在TableView.CollectionView中)当用户所处环境WiFi网速不够快(不能立即 ...
随机推荐
- linux 卸载 umount 提示device is busy
思路:先杀掉挂载的目录(如:/usr1/)这个进程 fuser -v /usr1/ 再卸载
- Error in mounted hook: "TypeError: handlers[i].call is not a function" 原因
Error in mounted hook: "TypeError: handlers[i].call is not a function" 百度翻译 安装钩子中的错误:" ...
- ZooKeeper CentOS7上安装
下载http://www.apache.org/dyn/closer.cgi/zookeeper(我下的是zookeeper-3.4.14) 1.创建 /usr/local/services/zook ...
- for循环中的let与var的说明
参考资料:<JavaScript高级程序设计> 在 let 出现之前,for 循环定义的迭代变量会渗透到循环体外部: for (var i = 0; i < 5; ++i) { ...
- plc模拟量采集模块的作用
在工业控制中,某些输入量(如压力.温度.流量.转速等)是连续变化的模拟量,某些执行机构(如伺服电动机.调节阀.记录仪等)要求PLC输出模拟信号,而PLC的CPU只能处理数字量.模拟量首先被传感器和变送 ...
- 阿里P6晋升到P7是一个坎吗? P7 晋升总结
作者:程序之心丁仪 来源:https://chengxuzhixin.com/blog/post/P6_jin_sheng_dao_P7_zong_jie.html 公众号停更了挺长一段时间,首先说声 ...
- 841. Keys and Rooms —— weekly contest 86
题目链接:https://leetcode.com/problems/keys-and-rooms/description/ 简单DFS time:9ms 1 class Solution { 2 p ...
- C++语言学习之STL 的组成
STL有三大核心部分:容器(Container).算法(Algorithms).迭代器(Iterator),容器适配器(container adaptor),函数对象(functor),除此之外还有S ...
- 在pandas中使用pipe()提升代码可读性
1 简介 我们在利用pandas开展数据分析时,应尽量避免过于碎片化的组织代码,尤其是创建出过多不必要的中间变量,既浪费了内存,又带来了关于变量命名的麻烦,更不利于整体分析过程代码的可读性,因此以流水 ...
- 推动中国制造升级,汽车装配车间生产流水线3D可视化
前言 随着<中国制造2025>的提出,制造业迎来了全新的发展机遇.更多的企业将制造业信息化技术进行广泛的应用,如 MES 系统.数字孪生以及生产管理可视化等技术的研究应用,已经成为社会各界 ...