vlambda博客
学习文章列表

.NET 5 ORM 八大实用技巧 干货 - SqlSugar ORM


阅读本文约需要5分钟

大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。上次老师跟大家分享了下高并发下的Node.js与负载均衡的相关知识,今天跟大家分享.NET 5 ORM 八大实用技巧 干货 - SqlSugar ORM 的相关知识
参考来源:https://www.cnblogs.com/sunkaixuan/p/14033683.html

介绍

sqlsugar已经在第一时间完美兼容.NET5并且已经有人在使用了, 很多人都担心用了开源框架遇到问题无法解决,导致前功尽弃,使用SqlSugar你大可放心,除了有详细文档和几年的大量用户积累,

SqlSugar还提供了完整的服务,让您的项目没有后顾之忧

优点: 简单易用、功能齐全、高性能、轻量级、服务齐全

支持数据库:MySql、SqlServer、Sqlite、Oracle 、 postgresql、达梦、人大金仓

免费服务

1、基本用法咨询

2、BUG提交

3、采纳建议和需求

4、代码开源 可用于任何商用项目

实践技巧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; //sql var exesql=sql; //参数 var sqlpars=p; //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}});
//库1try{db.BeginTran();db.Deleteable<Order>().ExecuteCommand();
db.ChangeDatabase("2");//使用库2db.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();
原码下载:https://github.com/sunkaixuan/SqlSugar

 
   
   
 
今天就分享这么多,关于.NET 5 ORM 八大实用技巧 干货 - SqlSugar ORM,你学会了多少?欢迎在留言区评论,对于有价值的留言,我们都会一一回复的。如果觉得文章对你有一丢丢帮助,请点右下角【在看】,让更多人看到该文章。
如果有想了解的,也可以进行留言