一,基礎搭建
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里面遨游。 后來實在忍受不了,
下狠心自己寫一個代碼生成器。
不說多好用,反正自己寫的東西,貴在一個靈活,能改。代碼我也是盡可能的簡單。這才緩解了我的抑郁。。。
暫時就說到這里,下一篇,講 代碼生成器 ,沒有鏈接 點 目錄 跳轉吧!