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

下狠心自己寫一個代碼生成器。

 

 

 

不說多好用,反正自己寫的東西,貴在一個靈活,能改。代碼我也是盡可能的簡單。這才緩解了我的抑郁。。。

 

暫時就說到這里,下一篇,講 代碼生成器 ,沒有鏈接 點   目錄 跳轉吧!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM