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 ... 
随机推荐
- A+B Problem C++
			前言继上次发表的A+B Problem C语言后,今天我们来学习一下A+B Problem C++ 正文什么是C++? C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象 ... 
- DRF安装与使用
			目录 DRF安装与使用 一.web应用模式(前后端不分离&前后端分离) 二.API接口 1.API接口概念讲解 2.IPA接口测试工具postman 3.RESTful API规范 4.幂等性 ... 
- mysql 5.7安装教程及密码设置
			1.安装网址 https://dev.mysql.com/downloads/mysql/ 2.点击 Archives 3.切换版本,之前安装过新版本出现过很多问题,为了方便学习,所以选择了5.7这个 ... 
- 华为云MRS支持lakeformation能力,打造一站式湖仓,释放数据价值
			摘要:对云端用户而言,业务价值发现是最重要的,华为MRS支持LakeFormation后,成功降低了数据应用的成本,帮助客户落地"存"与"算"的管理,加快推进了 ... 
- 【DS】1.2
			top-iron man 算法 效率度量 时间T=T(n) 1.顺序忽略2.只选一个基本操作分析3.多层嵌套只考虑最深的循环循环了几次 test1: test2: 空间 原地工作:算法所需内 ... 
- 【python自动化测试】1- python基础和pycharm使用
			python基础和pycharm使用 1.pycharm 1.1 为特定格式文件添加头信息 File--Settings--Editor--File and Code Templates--Pytho ... 
- 配置项目请求地址和axios以及实现token过期无痛刷新
			配置请求地址:config->index.js 一个项目里通常有一个config->index.js,该文件包含了当前项目的请求地址,以及项目的版本信息. // 请求地址 const AP ... 
- JZOJ 5432. 【NOIP2017提高A组集训10.28】三元组
			题目 有 \(X+Y+Z\) 个三元组 \((x[i],y[i],z[i])\),请你从每个三元组中挑数,并满足以下条件: 1.每个三元组中可以且仅可以选择一个数(即 \(x[i],y[i],z[i] ... 
- Ubuntu18.04安装教程
			转载csdn: Ubuntu18.04安装教程_Sunshine的博客-CSDN博客_ubuntu安装教程 
- el-input只能输入数字和小数
			1.oninput ="value=value.replace(/[^\d]/g,'')" //只能输入数字 2.oninput ="value=value.replac ... 
