首页 > 数据库 >SqlSugar DbContext

SqlSugar DbContext

时间:2024-01-24 13:26:00浏览次数:22  
标签:return string Db virtual DbContext new public SqlSugar

前言

什么是SqlSugar?
SqlSugar 是 .NET/C# 平台非常优秀的 ORM 框架,目前 Nuget 总下载突破 1000K,Github 关注量也高达 3.7K
SqlSugar 拥有高性能,具有百万级插入、更新大数据分表等特色功能,是目前当之无愧的国产优秀 ORM 框架之一。

  1. 支持 MySqlSqlServerSqliteOraclepostgresql达梦人大金仓 等多种数据库
  2. 支持 全自动分表
  3. 支持 多库事务
  4. 支持 CodeFirst / DbFirst
  5. 支持 联表查询嵌套查询导航查询子查询动态JSON查询等查询操作
  6. 支持 SqlServer、MySql、PgSql、Oracle 百万级插入和更新

个人感受
其实说起来接触SqlSugar的时间并不是很长,但是用过之后,只有一个感觉:太丝滑了!
文档齐全,新手上路贼容易,真的强烈推荐!!!
目前本人手里的项目,只要与数据库交互的,已经统统切换成了SqlSugar

.Net Framework部分

完整代码

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Data;
    using System.Linq.Expressions;
    using SqlSugar;
    using DbType = SqlSugar.DbType;
    
    namespace CodeProject.Database
    {
        /// <summary>
        /// 数据库上下文
        /// </summary>
        public class SqlSugarDbContext
        {
            /// <summary>
            /// 数据库连接字符串(私有字段)
            /// </summary>
            private static string DbConnString = ConfigurationManager.ConnectionStrings["sqlConStr"].ConnectionString;
    
            /// <summary>
            /// 数据库类型(私有字段)
            /// </summary>
            private static string _databaseType = ConfigurationManager.ConnectionStrings["sqlConStr"].ProviderName;
    
            /// <summary>
            /// 用来处理事务多表查询和复杂的操作
            /// 注意:不能写成静态的
            /// </summary>
            public SqlSugarClient Db;
    
            public SqlSugarDbContext()
            {
                DbType dbType;
                switch (_databaseType)
                {
                    case "System.Data.SqlClient":
                        dbType = DbType.SqlServer;
                        break;
                    case "System.Data.SqliteClient":
                        dbType = DbType.Sqlite;
                        break;
                    case "MySql.Data.MySqlClient":
                        dbType = DbType.MySql;
                        break;
                    case "Oracle.ManagedDataAccess.Client":
                        dbType = DbType.Oracle;
                        break;
                    default:
                        dbType = DbType.SqlServer;
                        break;
                }
    
                Db = new SqlSugarClient(new ConnectionConfig()
                {
                    ConnectionString = DbConnString,//数据库连接串
                    DbType = dbType,//数据库类型
                    InitKeyType = InitKeyType.SystemTable,//从数据库中读取主键和自增列信息         //InitKeyType.Attribute,//从特性读取主键和自增列信息
                    IsAutoCloseConnection = true,//开启自动释放模式和EF原理一样我就不多解释了
    
                });
                //调式代码 用来打印SQL 
                Db.Aop.OnLogExecuting = (sql, pars) =>
                {
                    Console.WriteLine(sql + "\r\n" +
                        Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
                    Console.WriteLine();
                };
            }
    
            #region 库表操作
            /// <summary>
            /// 备份表
            /// </summary>
            /// <param name="oldname">旧表名称</param>
            /// <param name="newname">新表名称</param>
            /// <returns></returns>
            public virtual bool BackupTable(string oldname, string newname)
            {
                if (!Db.DbMaintenance.IsAnyTable(newname, false))
                {
                    return Db.DbMaintenance.BackupTable(oldname, newname, 0);
                }
                return false;
            }
            /// <summary>
            /// 删除表
            /// </summary>
            /// <param name="tablename">表名称</param>
            /// <returns></returns>
            public virtual bool DropTable(string tablename)
            {
                return Db.DbMaintenance.DropTable(tablename);
            }
    
            /// <summary>
            /// 清空表
            /// </summary>
            /// <param name="tablename">表名称</param>
            /// <returns></returns>
            public virtual bool TruncateTable(string tablename)
            {
                return Db.DbMaintenance.TruncateTable(tablename);
            }
    
            #region CodeFirst 类-->表
            /// <summary>
            /// 创建单一表 
            /// </summary>
            /// <param name="entityType"></param>
            public void CreateTable(Type entityType)
            {
                Db.CodeFirst.SetStringDefaultLength(200).BackupTable().InitTables(entityType);
            }
    
            /// <summary>
            /// 批量创建表
            /// </summary>
            /// <param name="entityTypes"></param>
            public void CreateTables(Type[] entityTypes)
            {
                Db.CodeFirst.SetStringDefaultLength(200).BackupTable().InitTables(entityTypes);
            }
            #endregion
    
            #region DbFirst 表-->类
            /// <summary>
            /// 根据数据库表 生成实体类文件
            /// 数据库表名统一格式:XX_XXX  如:Sys_UserInfo
            /// </summary>
            /// <param name="filePath">类文件地址</param>
            /// <param name="nameSpace">命名空间</param>
            /// <param name="tableName">表名称</param>
            public virtual void CreateClassFiles(string filePath, string nameSpace, string tableName)
            {
                #region 格式化 实体类文件名称
                //循环遍历 数据库里的所有表  
                foreach (var item in Db.DbMaintenance.GetTableInfoList())
                {
                    string entityName = string.Empty;
                    if (item.Name.Contains("_"))
                    {
                        var tbName = item.Name.Split('_');
                        entityName = tbName[1] + "Entity";
                        Db.MappingTables.Add(entityName, item.Name);
                    }
                    else
                    {
                        entityName = item.Name + "Entity";
                        Db.MappingTables.Add(entityName, item.Name);
                    }
                    //循环遍历  当前表的所有列
                    foreach (var col in Db.DbMaintenance.GetColumnInfosByTableName(item.Name))
                    {
                        //所有列全部转大写
                        Db.MappingColumns.Add(col.DbColumnName.ToUpper(), col.DbColumnName, entityName);
                    }
                }
                #endregion
    
                //生成指定表名的实体类文件
                if (!string.IsNullOrEmpty(tableName))
                {
                    //生成带有SqlSugar特性的实体类文件
                    Db.DbFirst.Where(tableName).IsCreateAttribute(true).CreateClassFile(filePath, nameSpace);
                }
                //生成所有表的实体类文件
                else
                {
                    //生成带有SqlSugar特性的实体类文件
                    Db.DbFirst.IsCreateAttribute(true).CreateClassFile(filePath, nameSpace);
                }
            }
            #endregion
            #endregion
    
            #region 事务操作
            /// <summary>
            /// 开启事务
            /// </summary>
            public virtual void BeginTran()
            {
                Db.Ado.BeginTran();
            }
    
            /// <summary>
            /// 提交事务 
            /// </summary>
            public virtual void CommitTran()
            {
                Db.Ado.CommitTran();
            }
    
            /// <summary>
            /// 回滚事务
            /// </summary>
            public virtual void RollbackTran()
            {
                Db.Ado.RollbackTran();
            }
            #endregion
    
            #region 原生Sql
            /// <summary>
            /// 针对于 增删改
            /// </summary>
            /// <param name="sql"></param>
            /// <returns></returns>
            public virtual int ExecuteCommand(string sql, params SugarParameter[] pars)
            {
                return Db.Ado.ExecuteCommand(sql, pars);
            }
    
            /// <summary>
            /// 返回集合
            /// </summary>
            /// <param name="sql"></param>
            /// <returns>返回DataTable</returns>
            public virtual DataTable GetDataTable(string sql, params SugarParameter[] pars)
            {
                return Db.Ado.GetDataTable(sql, pars);
            }
    
            /// <summary>
            /// 返回多个集合
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="pars"></param>
            /// <returns></returns>
            public virtual DataSet GetDataSet(string sql, params SugarParameter[] pars)
            {
                return Db.Ado.GetDataSetAll(sql, pars);
            }
    
            /// <summary>
            /// 调用存储过程 返回Output参数
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="pars"></param>
            /// <returns>返回int</returns>
            public virtual int ExecProcToInt(string sql, params SugarParameter[] pars)
            {
                int proc_count = 0;
                try
                {
                    BeginTran();
                    proc_count = Db.Ado.UseStoredProcedure().GetInt(sql, pars);
                    CommitTran();
                }
                catch (Exception ex)
                {
                    RollbackTran();
                    throw ex;
                }
    
                return proc_count;
            }
    
            /// <summary>
            /// 调用存储过程
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="pars"></param>
            /// <returns>返回DataTable</returns>
            public virtual DataTable ExecProcToDT(string sql, params SugarParameter[] pars)
            {
                DataTable dt = new DataTable();
                try
                {
                    BeginTran();
                    dt = Db.Ado.UseStoredProcedure().GetDataTable(sql, pars);
                    CommitTran();
                }
                catch (Exception ex)
                {
                    RollbackTran();
                    throw ex;
                }
    
                return dt;
            }
    
            /// <summary>
            /// 调用存储过程
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="pars"></param>
            /// <returns>返回DataSet</returns>
            public virtual DataSet ExecProcToDS(string sql, params SugarParameter[] pars)
            {
                DataSet ds = new DataSet();
                try
                {
                    BeginTran();
                    ds = Db.Ado.UseStoredProcedure().GetDataSetAll(sql, pars);
                    CommitTran();
                }
                catch (Exception ex)
                {
                    RollbackTran();
                    throw ex;
                }
    
                return ds;
            }
            #endregion
    
            #region 泛型CURD
            /// <summary>
            /// 校验数据是否存在
            /// </summary>
            /// <param name="expression">Lambda表达式(查询条件)</param>
            /// <returns></returns>
            public virtual bool Any<TEntity>(Expression<Func<TEntity, bool>> expression) where TEntity : class, new()
            {
                return Db.Queryable<TEntity>().Any(expression);
            }
    
            /// <summary>
            /// 检查信息总条数
            /// </summary>
            /// <param name="expression">Lambda表达式(查询条件)</param>
            /// <returns></returns>
            public virtual int Count<TEntity>(Expression<Func<TEntity, bool>> expression) where TEntity : class, new()
            {
                return Db.Queryable<TEntity>().Count(expression);
            }
    
            /// <summary>
            /// 查询实体
            /// </summary>
            /// <param name="keyValue"></param>
            /// <returns>单条记录</returns>
            public virtual TEntity FindEntity<TEntity>(object keyValue) where TEntity : class, new()
            {
                return Db.Queryable<TEntity>().InSingle(keyValue);
            }
    
            /// <summary>
            /// 查询实体集合
            /// </summary>
            /// <returns></returns>
            public virtual ISugarQueryable<TEntity> Queryable<TEntity>() where TEntity : class, new()
            {
                return Db.Queryable<TEntity>();
            }
    
            /// <summary>
            /// 自定义条件查询
            /// </summary>
            /// <param name="expression">Lambda表达式(查询条件)</param>
            /// <returns></returns>
            public virtual ISugarQueryable<TEntity> Queryable<TEntity>(Expression<Func<TEntity, bool>> expression) where TEntity : class, new()
            {
                return Db.Queryable<TEntity>().Where(expression);
            }
    
            /// <summary>
            /// 通过SQL语句查询
            /// </summary>
            /// <param name="strSql">SQL语句</param>
            /// <returns></returns>
            public virtual ISugarQueryable<TEntity> Queryable<TEntity>(string strSql) where TEntity : class, new()
            {
                return Db.SqlQueryable<TEntity>(strSql);
            }
    
            /// <summary>
            /// 新增
            /// </summary>
            /// <param name="entity">实体信息</param>
            /// <returns></returns>
            public virtual int Insertable<TEntity>(TEntity entity) where TEntity : class, new()
            {
                return Db.Insertable(entity).ExecuteCommand();
            }
    
            /// <summary>
            /// 批量新增
            /// </summary>
            /// <param name="entities">实体信息集合</param>
            /// <returns></returns>
            public virtual int Insertable<TEntity>(List<TEntity> entities) where TEntity : class, new()
            {
                return Db.Insertable(entities).ExecuteCommand();
            }
    
            /// <summary>
            /// 编辑
            /// </summary>
            /// <param name="entity">实体信息</param>
            /// <returns></returns>
            public virtual int Updateable<TEntity>(TEntity entity) where TEntity : class, new()
            {
                return Db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();
            }
    
            /// <summary>
            /// 自定义条件编辑
            /// </summary>
            /// <param name="content"></param>
            /// <param name="predicate"></param>
            /// <returns></returns>
            public virtual int Updateable<TEntity>(Expression<Func<TEntity, TEntity>> content, Expression<Func<TEntity, bool>> predicate) where TEntity : class, new()
            {
                return Db.Updateable(content).Where(predicate).ExecuteCommand();
            }
    
            /// <summary>
            /// 删除
            /// </summary>
            /// <param name="entity">实体信息</param>
            /// <returns></returns>
            public virtual int Deleteable<TEntity>(TEntity entity) where TEntity : class, new()
            {
                return Db.Deleteable(entity).ExecuteCommand();
            }
    
            /// <summary>
            /// 自定义条件删除
            /// </summary>
            /// <param name="expression">Lambda表达式(查询条件)</param>
            /// <returns></returns>
            public virtual int Deleteable<TEntity>(Expression<Func<TEntity, bool>> expression) where TEntity : class, new()
            {
                return Db.Deleteable(expression).ExecuteCommand();
            }
            #endregion
        }
    }

使用示例

    //数据库上下文 初始化
    SqlSugarDbContext db = new SqlSugarDbContext();

    #region 原生Sql
    var dt = db.GetDataTable(strSql,pars);//返回DataTable
    var ds = db.GetDataSet(strSql,pars);//返回DataSet
    var count = db.ExcuteCommand(strSql,pars);//针对于增删改,返回受影响行数
    ...
    #endregion

    #region 泛型CURD
    var list = db.Queryable<TEntity>().ToList();//返回集合
    var list = db.Queryable<TEntity>(expression).ToList();//返回集合
    ...
    #endregion
    ...

.Net Core部分

完整代码

标签:return,string,Db,virtual,DbContext,new,public,SqlSugar
From: https://www.cnblogs.com/wuccloud/p/17984451

相关文章

  • SqlSugar分表
    一、使用场景 (1)可扩展架构设计,比如一个ERP用5年不卡,到了10就卡了因为数据太多了,这个时候很多人都是备份然后清空数据 (2) 数据量太多,例如每天都有 几十上百万的数据进入库,如果不分表后面查询将会非常缓慢  (3)  性能瓶颈,数据库现有数据超过1个亿,很多情况下索引会莫名......
  • SqlSugar多库/多租户
    1、多库和多租户如果是接口ISugarClient先看一下标题6,看完在看这儿1.1固定多数据库模式数据库数量是固定的一般在声明的全部加上//通过ConfigId进行数据库区分var db = new SqlSugarClient(new List<ConnectionConfig>(){ //这儿声名所有上下文都生效 new ......
  • SqlSugar常见问题汇总
    1、已有打开的与此Command相关联的DataReader,必须首先将它关闭。ThereisalreadyanopenDataReaderassociatedwiththisConnectionwhichmustbeclosedfirst.或者出现connectionisclosed出现这个错一般是线程安全引起的解决方案: https://www.donet5.com/Home/......
  • SqlSugar的Repository
    1、仓储说明仓储可以让你的方法更加的规范,需要什么方法都封装到仓储中,下次就能重复使用,并且能很好的和你业务拆分开 这种设计模式简单粗暴用起来也方便,文章下面有可以运行的DEMO 2、仓储方法仓储有一套自带的数据库操作方法,比起db.xx.xxx来说可能更简便些满足一些常用需......
  • SqlSugar的查询函数SqlFunc
    用法我们可以使用SqlFunc这个类调用Sql函数,用法如下:db.Queryable<Student>().Where(it => SqlFunc.ToLower(it.Name) == SqlFunc.ToLower("JACK")).ToList(); C#函数支持一些常用的C#函数.ToString .Contains .Length.ToLower .ToUpper .ToSubstrin......
  • SqlSugar的Where用法
    1、普通表达式查询//id=@idvar list=db.Queryable<Student>().Where(it => it.Id == id).ToList(); //多个条件var list2=db.Queryable<Student>().WhereIF(id>0,it => it.Id == id)// 如果id>0 添加条件 id=@id  .WhereIF(name!=null,it => it.nam......
  • SqlSugar的Select用法
    Select位置正常情况:应该在最后面,一般是.Where(..).OrderBy(..).Select(..).ToList()特殊情况:如果Select不是最后一个位置,则Select要加MergeTable()合并成一个表,Select(...).MergeTable().Where语法糖:Select(...).MergeTable()在新版本中可以用SelectMergeTable(it=>newx......
  • SqlSugar跨库查询/多库查询
    一、跨库方式1:跨库导航(5.1.3.24)优点1:支持跨服务器,支持跨数据库品种,支持任何类型数据库 优点2:  超级强大的性能,能达到本库联表性能缺点:不支持子表过滤主表(方案有ToList后在内存过滤,如果分页可以查前1000条主表在内存分页前端只显示前10页)[Tenant("db2")] //......
  • SqlSugar新增数据
    1、插入方式1.1单条插入实体//返回插入行数db.Insertable(insertObj).ExecuteCommand(); //都是参数化实现//异步: await db.Insertable(insertObj).ExecuteCommandAsync() //插入返回自增列 (实体除ORACLE外实体要配置自增,Oracle需要配置序列)db.Insertable(in......
  • SqlSugar更新数据
    1、根据实体对象更新所谓按实体对象更新就是:db.Updateable(参数对象)有参数的重载db.Updateable(实体或者集合).ExecuteCommand() //右标题1 下面的所有菜单优点1、代码少2、支持各种批量修改缺点1、不支持表达式和sql函数2、依赖 实体对象,没实体对象就需......