手把手撸套框架-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里面遨游。 后来实在忍受不了,

下狠心自己写一个代码生成器。

 

 

 

不说多好用,反正自己写的东西,贵在一个灵活,能改。代码我也是尽可能的简单。这才缓解了我的抑郁。。。

 

暂时就说到这里,下一篇,讲 代码生成器 ,没有链接 点   目录 跳转吧!

 

posted @ 2020-07-17 17:21  Near_wen  阅读(15307)  评论(2编辑  收藏  举报