手把手撸套框架-SqlSugar搭建与避坑
一,基础搭建
SqlSugar,实在是太简单了,基本看一眼官网就会了。
官网:http://www.codeisbug.com/Doc/8
那我为什么还要专门来写篇博客呢? 主要是完整照着官网来,坑定掉坑里。我想把我遇到的几个问题记录一下,顺便普及一下Sqlguar。
首先来说一下,安装:
官网基本说的很明白,SqlSugar 分为 .net framework 版本 和 .net core版本,这个做项目的实话 别选错了。
这里我强烈建议,没有转.net Core的 新项目尽快 转.net core 。两个性能不在一个量级,另外就算你今天不转,再过几个月照样要转。
.net Core 5.0 号称 “大一统”, 转core 早晚的事, 不如尽早接触,积累经验。
通过nuget 添加程序集之后,直接配置一个 连接字符串就可以用了,非常简单:
SqlSugarClient db = new SqlSugarClient( new ConnectionConfig() { ConnectionString = "server=.;uid=sa;pwd=@jhl85661501;database=SqlSugar4XTest", DbType = DbType.SqlServer,//设置数据库类型 IsAutoCloseConnection = true,//自动释放数据务,如果存在事务,在事务结束后释放 InitKeyType = InitKeyType.Attribute //从实体特性中读取主键自增列信息 }); //用来打印Sql方便你调式 db.Aop.OnLogExecuting = (sql, pars) => { Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))); Console.WriteLine(); };
/*查询*/ var list = db.Queryable<StudentModel>().ToList();//查询所有 var getById = db.Queryable<StudentModel>().InSingle(1);//根据主键查询 var getByWhere = db.Queryable<StudentModel>().Where(it=>it.Id==1).ToList();//根据条件查询 var total = 0; var getPage = db.Queryable<StudentModel>().Where(it => it.Id == 1).ToPageList(1,2,ref total);//根据分页查询 //多表查询用法 http://www.codeisbug.com/Doc/8/1124 /*插入*/ var data = new Student() { Name = "jack" }; db.Insertable(data).ExecuteCommand(); //更多插入用法 http://www.codeisbug.com/Doc/8/1130 /*更新*/ var data2 = new Student() { Id =1, Name = "jack" }; db.Updateable(data2).ExecuteCommand(); //更多更新用法 http://www.codeisbug.com/Doc/8/1129 /*删除*/ db.Deleteable<StudentModel>(1).ExecuteCommand();
以上代码都是从官网复制过来的,实际使用可以参考,里面的“三分钟高手”里面的写法:
public class DbContext<T> where T: class,new() { public DbContext() { Db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = "server=.;uid=sa;pwd=@jhl85661501;database=SqlSugar4XTest", DbType = DbType.SqlServer, InitKeyType = 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(); }; } //注意:不能写成静态的 public SqlSugarClient Db;//用来处理事务多表查询和复杂的操作 public SimpleClient<Student> StudentDb { get { return new SimpleClient<Student>(Db); } }//用来处理Student表的常用操作 public SimpleClient<School> SchoolDb { get { return new SimpleClient<School>(Db); } }//用来处理School表的常用操作 public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } }//用来处理T表的常用操作 /// <summary> /// 获取所有 /// </summary> /// <returns></returns> public virtual List<T> GetList() { return CurrentDb.GetList(); } /// <summary> /// 根据主键删除 /// </summary> /// <param name="id"></param> /// <returns></returns> public virtual bool Delete(dynamic id) { return CurrentDb.Delete(id); } /// <summary> /// 更新 /// </summary> /// <param name="id"></param> /// <returns></returns> public virtual bool Update(T obj) { return CurrentDb.Update(obj); } }
然后 去继承这个基类就行了,给泛型一个映射实体:
目录结构:
至此,基本的搭建就结束了,但是看到这里,坑也就来了。
二,SqlSugar 避坑
(1)我遇到的第一个坑就是只看了官网的说明,没有变通。官网上,不是这样写的吗?
我以为,每个Da对象(数据表操作类) 都要在 DbContxt 中配置一下,搞的我新建一个Da文件 就要去配置一下,实在是麻烦,后来查文档知道了,
SqlSugar 提供了一个 :
1,SimpleClient 简易版的操作类,
2,SqlSugarClient 完全版操作类
我也不知道这样理解对不对, 总之 是没必要,每次添加一个Da 都去 配置一下。
public class DbContext<T> where T : class, new() { //注意:不能写成静态的 public SqlSugarClient Db;//用来处理事务多表查询和复杂的操作 public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } }//用来操作当前表的数据 public DbContext() { Db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = AppConfig.DB, DbType = DbType.Oracle, InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息 IsAutoCloseConnection = true,//开启自动释放模式和EF原理一样我就不多解释了 }); //调式代码 用来打印SQL Db.Aop.OnLogExecuting = (sql, pars) => { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); Console.WriteLine(); Console.WriteLine(sql); Console.WriteLine(); Console.WriteLine(Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))); Console.WriteLine(); }; } }
所以,我改造了一下,就变得非常简洁了,连下面的封装都不要了,另外,下面的封装我在实际使用中,Update方法 修改实体的时候,有报错,我也没找到原因。
这样简洁,看上去舒服多了。
(2)我遇到的第二个坑就是,代码生成器。SqlSugar 只是一个ORM框架,他是不管代码生成器这一块的,包括Da(数据表操作类) 、Model (实体类)
这里好在,有社区有些好心人事,给开发了代码生成器。当然也可以使用 一些三方的代码生成器,反正能生成实体就行。
这里我就用了官网里面的 这个生成器,简直无力吐槽:
就这个,具体怎么说呢? 反正很垃圾。。。。。
这个还可以,但是我在官网没有找到链接,应该是作者没有上传官网,我是后来在 Sqlsugar 的交流群中,找到的。 这个还不错,不过也有一个大坑。 对Oracle 不友好。
用过Oralce 的知道,Oracle 数据库字段 是全大写的,所以坑就是,我用代码生成器,生成出来的model 全是大写:
不过,如果是Code-First 自然是不会有这个问题,只是我个人还是不怎么习惯 Code-first 这种开发方式。 全大写当然不影响使用,
或者 不要用官网提供的 代码生成器 就行了。可是我就 迷迷糊糊的 用了两个星期,在全大写 的Model里面遨游。 后来实在忍受不了,
下狠心自己写一个代码生成器。
不说多好用,反正自己写的东西,贵在一个灵活,能改。代码我也是尽可能的简单。这才缓解了我的抑郁。。。
暂时就说到这里,下一篇,讲 代码生成器 ,没有链接 点 目录 跳转吧!