Sql Sugar 使用
sql sugar orm文档地址: SqlSugar ORM 5.X 官网 、文档、教程 - SqlSugar 5x - .NET果糖网 (donet5.com)
sql sugar 基本用法大全,来自博主 @天才卧龙 :https://www.cnblogs.com/chenwolong/p/13858384.html
.net 5.0 + sqlsugarcore(5.0.4.2)
一、SqlSugarScope 、SqlSugarClient 、SqlConnection区别
一、区别
scope是对client的进一步封装,为了支持线程安全,并且在不同上下文中自动new出一个client,在编写代码时不需要考虑他线程是否安全
二、总结
他们3者的关系应该是这样的:
SqlSugarScope 底层+自动释放+上下文安全
SqlSugarClient 底层+自动释放控制
SqlConnection 底层
三、引申
1.什么是上下文?
异步情况: 在同一串await 中是一个上下文
同步情况: 在同一个线程是同一个上下文
同一个SqlSugarScope做到了在同一个上下文共享一个对象,不同上下文自动去NEW
二、Code First、DB First
一、code first
1.创建方式
/// <summary>
/// 代码优先
/// </summary>
public static void CodeFirstShow()
{
ConnectionConfig config = new ConnectionConfig()
{
ConnectionString = "",
DbType = DbType.SqlServer,
IsAutoCloseConnection = true,
};
using (SqlSugarClient db = new SqlSugarClient(config))
{
//如果不存在创建数据库
db.DbMaintenance.CreateDatabase();
Type[] types = Assembly
.LoadFrom("类库")
.GetTypes()
.ToArray();
db.CodeFirst.SetStringDefaultLength(200).InitTables(types);
}
}
2.code first 上下文创建数据库
public class SugarDbContext
{
public SqlSugarClient Db;
public SugarDbContext()
{
Db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = "server=.;database=StudentDb;uid=cnpy;pwd=cnpy1314;",
DbType = DbType.SqlServer,//设置数据库类型
IsAutoCloseConnection = true,//自动释放数据库,如果存在事务,在事务结束之后释放。
InitKeyType = InitKeyType.Attribute//从实体特性中读取主键自增列信息
});
Db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(sql + "\r\n" + Db.Utilities.SerializeObject
(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
Console.WriteLine();
};
}
public void CreateTable(bool Backup = false, int StringDefaultLength = 50, params Type[] types)
{
Db.CodeFirst.SetStringDefaultLength(StringDefaultLength);
Db.DbMaintenance.CreateDatabase();
if (Backup)
{
Db.CodeFirst.BackupTable().InitTables(types);
}
else
{
Db.CodeFirst.InitTables(types);
}
}
public SimpleClient<Students> studentDb { get { return new SimpleClient<Students>(Db); } }
public SimpleClient<Schools> schoolDb { get { return new SimpleClient<Schools>(Db); } }
}
二、DB First
1.创建方式
/// <summary>
/// 数据库优先
/// </summary>
public static void DbFirstShow() {
ConnectionConfig config = new ConnectionConfig() {
ConnectionString="",
DbType=DbType.SqlServer,
IsAutoCloseConnection=true,
};
using (SqlSugarClient db=new SqlSugarClient(config))
{
//IsCreateAttribute:代表生成sqlsugar特性.
db.DbFirst
.IsCreateAttribute()
.CreateClassFile("类库所在文件夹","类库名称");
}
}
数据表
! 联表查询
联表查询:
SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig() {
ConnectionString = "Data Source=.;Initial Catalog=CoreShop;User ID=sa;Password=sa123;",
DbType = DbType.SqlServer,
IsAutoCloseConnection = true
});
Db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(sql);//输出sql,查看执行sql 性能无影响
//5.0.8.2 获取无参数化SQL 对性能有影响,特别大的SQL参数多的,调试使用
//UtilMethods.GetSqlString(DbType.SqlServer,sql,pars)
};
var cart = Db.Queryable<CoreCmsCart>().ToList();
var goods= Db.Queryable<CoreCmsProducts, CoreCmsGoods, CoreCmsCart>((o, i, c) => new JoinQueryInfos(
JoinType.Left, o.goodsId == i.id, //左连接 左链接 左联
JoinType.Left, o.id == c.productId))
.Select((o, i, c) => new { name=i.name, price = o.price })
.ToList();
//实战应用:
var view = new object ();
var items = _coreCmsGoodsServices.QueryMuch<CoreCmsProducts, CoreCmsGoods, CoreCmsCart, GoodsDetailsVM>(
(p, g, c) => new object[] { JoinType.Left, p.goodsId == g.id, JoinType.Left, p.id == c.productId },
(p, g, c) => new GoodsDetailsVM { Id = c.id, name = g.name, price = p.price }
);
三、项目使用
1、启动sqlsugar服务
/// <summary>
/// SqlSugar 启动服务
/// </summary>
public static class SqlSugarSetup
{
public static void AddSqlSugarSetup(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services));
//注入 ORM
SugarIocServices.AddSqlSugar(new IocConfig()
{
//数据库连接
ConnectionString = AppSettingsConstVars.DbSqlConnection,
//判断数据库类型
DbType = AppSettingsConstVars.DbDbType == IocDbType.MySql.ToString() ? IocDbType.MySql : IocDbType.SqlServer,
//是否开启自动关闭数据库连接-//不设成true要手动close
IsAutoCloseConnection = true,
});
//设置参数
services.ConfigurationSugar(db =>
{
db.CurrentConnectionConfig.InitKeyType = InitKeyType.Attribute;
//db.CurrentConnectionConfig.ConfigureExternalServices = new ConfigureExternalServices()
//{
// //判断是否开启redis设置二级缓存方式
// DataInfoCacheService = AppSettingsConstVars.RedisUseCache ? (ICacheService)new SqlSugarRedisCache() : new SqlSugarMemoryCache()
//};
//执行SQL 错误事件,可监控sql(暂时屏蔽,需要可开启)
//db.Aop.OnLogExecuting = (sql, p) =>
//{
// NLogUtil.WriteFileLog(NLog.LogLevel.Error, LogType.Other, "SqlSugar执行SQL错误事件打印Sql", sql);
//};
//执行SQL 错误事件
db.Aop.OnError = (exp) =>
{
NLogUtil.WriteFileLog(NLog.LogLevel.Error, LogType.Other, "SqlSugar", "执行SQL错误事件", exp);
};
//设置更多连接参数
//db.CurrentConnectionConfig.XXXX=XXXX
//db.CurrentConnectionConfig.MoreSetting=new MoreSetting(){}
//读写分离等都在这儿设置
});
}
}
2、注入服务
//添加数据库连接SqlSugar注入支持
services.AddSqlSugarSetup();
3.创建工作单元接口、实现 UnitOfWork
- 接口 IUnitOfWork
using SqlSugar;
public interface IUnitOfWork
{
SqlSugarScope GetDbClient();//获取db对象
void BeginTran();//开启事务
void CommitTran();//提交事务
void RollbackTran();//回滚是u我
}
- 实现 UnitOfWork
点击查看代码
public class UnitOfWork : IUnitOfWork
{
private readonly ISqlSugarClient _sqlSugarClient;
public UnitOfWork()
{
_sqlSugarClient = DbScoped.SugarScope;
}
/// <summary>
/// 获取DB,保证唯一性
/// </summary>
/// <returns></returns>
public SqlSugarScope GetDbClient()
{
// 必须要as,后边会用到切换数据库操作
return _sqlSugarClient as SqlSugarScope;
}
public void BeginTran()
{
GetDbClient().BeginTran();
}
public void CommitTran()
{
try
{
GetDbClient().CommitTran(); //
}
catch (Exception ex)
{
GetDbClient().RollbackTran();
NLogUtil.WriteFileLog(LogLevel.Error, LogType.Web, "事务提交异常", "事务提交异常", new Exception("事务提交异常", ex));
throw;
}
}
public void RollbackTran()
{
GetDbClient().RollbackTran();
}
}
4、使用
Sql Sugar 使用的更多相关文章
- .Net Core,VUE,VS Code,Sql Sugar,Element UI学习笔记
1..Net Core的目的是跨平台,并主要目标是作为服务端开发使用.从3.0开始,引入了Winfrom和WPF. 2..Net Core可以引用.Net Framework生成的dll和exe,不限 ...
- sql sugar
事务 using (var db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = Config.xxx, DbType ...
- 基于封装通用的EF CRUD 的操作
1. Entity Framework是Microsoft的ORM框架,随着 Entity Framework 不断的完善强化已经到达了EF 6.0+ 还是非常的完善的,目前使用的比例相对于其他OR ...
- 关于EF 通用增删改查的封装
1. Entity Framework是Microsoft的ORM框架,随着 Entity Framework 不断的完善强化已经到达了EF 6.0+ 还是非常的完善的,目前使用的比例相对于其他OR ...
- Android SugarORM(4)
Android Sugar ORM(4) Android Sugar ORM 数据库迁移 据官网描述, Sugar ORM的设计灵感来自与Rails(没用过, 咱也不知道是啥, 以后也许会学到吧)迁移 ...
- 如何优雅的写一篇安利文-以Sugar ORM为例
前言 我最近喜欢把写的十分优美的技术文章叫做安利文.首先,文章必须是原创而非软广:其次,阅读之后不仅能快速吸纳技术要点并入门开发,还能感同身受的体会作者热情洋溢的赞美和急于分享心得体验的心情,让人感觉 ...
- Android免坑指南(一)Sugar与SQLite
最近在Android手机开发中使用了ORM框架Sugar1.4,节省了大量代码,同时也遇到不少麻烦,记录如下: 1. 使用group by将查询结果转换为POJO对象 在Sugar1.4中,可以使用如 ...
- Csharp Syntactic sugar
C#语法糖(Csharp Syntactic sugar)大汇总 首先需要声明的是“语法糖”这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换:而且可以提高开发编码的效率,在 ...
- SQL基础笔记
Codecademy中Learn SQL, SQL: Table Transformaton和SQL: Analyzing Business Metrics三门课程的笔记,以及补充的附加笔记. Cod ...
- sql script: Graphs, Trees, Hierarchies and Recursive Queries
--------------------------------------------------------------------- -- Inside Microsoft SQL Server ...
随机推荐
- 自定义alert弹框,去掉IP以及端口号提示
最新版例子~~ 如果同时多个弹框,只显示第一个 <!DOCTYPE html> <html lang="en"> <head> <met ...
- three.js一步一步来--如何画出构造辅助线
可以参考下面代码,粘贴上去就有了~ <template> <div class="container"> <h1>初步构造出辅助线</h1 ...
- IntelliJ中高效重构的 10 个快捷方式
前言 在日常的开发工作中,我们经常需要重构,重构可以让我们写出的代码更上一层楼.所以,我会借助IntelliJ提供的一些功能,帮助我高效进行重构.这里是我推荐10个快捷方式,也是我每天都在使用的,非常 ...
- 音频编辑服务UI SDK接入指导及常见问题
华为 HMS Core 音频编辑服务(Audio Editor Kit)是华为帮助全球开发者快速构建各类应用音频能力的服务,汇聚了华为在音乐.语音等相关音频领域的先进技术.音频编辑服务为开发者们提供音 ...
- 如何通过Zabbix Docker配置HTTPS访问系统?
概述 前面文章曾介绍过如果使用docker-compose快速部署一个Zabbix系统,但是部署的Zabbix系统是使用http协议进行访问的.有时候为了保证安全.我们需要配置使用https协议进行访 ...
- SpringBoot学习笔记 - 构建、简化原理、快速启动、配置文件与多环境配置、技术整合案例
[前置内容]Spring 学习笔记全系列传送门: Spring学习笔记 - 第一章 - IoC(控制反转).IoC容器.Bean的实例化与生命周期.DI(依赖注入) Spring学习笔记 - 第二章 ...
- 洛谷p5723
1 #include<bits/stdc++.h> 2 using namespace std; 3 int z(int a) 4 { 5 if(a==2) return 1; 6 if( ...
- 郁金香 fs寄存器
为什么我们在追eax要挂主线程呢,这是因为它的数据来源在fs中 004D1000 为什么是这个呢 $ ==> 0392FFDC 指向SEH链表指针 $+4 03930000 线程堆栈顶部(地址最 ...
- echarts的颜色渐变
官网文档解释 // 线性渐变,前四个参数分别是 x0, y0, x2, y2, //范围从 0 - 1,相当于在图形包围盒中的百分比, //如果 global 为 `true`,则该四个值是绝对的像素 ...
- JZOJ 1077. 【GDKOI2006】防御力量
\(\text{Solution}\) 首先这个题目描述得不清不楚 反正做法是过 \(A\) 城引一条直线,算出直线两侧点数的 \(min\) 找到最优直线,即 \(min\) 最小的 那么重点在判断 ...