0%

[DotnetCore]ORM系列-SqlSugar:入門篇

前提情要

又來到介紹ORM框架的時候到了,筆者之前就介紹過類似的[DotnetCore]ORM系列-Chloe:入門篇,總覺得差一點,類似像Interceptor, Chloe部份是DataBag的概念,可以於Interceptor事件間傳遞物件,筆者寫過一篇[DotnetCore]ORM系列-EFCore:資料表共同欄位設定,其中針對每個表中共同擁有的欄位做更新時著實方便。
Chloe也不是做不到,因Interceptor中可存取到IDBCommand,必須自己加以實作,不像EFCoreSqlSugar那樣有包好的事件可使用。筆者於公司開發專案環境中使用EFCoreDapper,由於Dapper必須得撰寫sql,Insert、Update時EFCore方便些,由於筆者對於EFCore也不是非常熟捻,因此於Hangfire併發Job時吃了一點苦,高併發會導致連線錯亂,直接噴無法連線資料庫等各種不可控的錯誤,心念一轉,何不直接導入此主題要介紹的ORM框架-SqlSugar

  • 可以透過Linq完成資料庫資料庫DML操作(select, insert, update, delete)
  • 可以透過純sql的方式完成DML操作(plain sql, store procedure)
  • 可以使用ADO.Net的各種method
  • 跨資料庫存取
  • 多種資料庫資源
  • 一個專案可以設置多個config連線至多個資料庫操作

內容

這篇就以入們應用為主,筆者繼續使用之前設置過的環境,請參考

建立Demo專案

筆者直接使用cli指令完成建置新專案

1
2
3
mkdir Demo.ORM
cd Demo.ORM
dotnet new webapi -o Demo.ORM.API --no-https -f net5.0

執行看看有無問題

1
2
3
cd Demo.ORM.API
dotnet run
# 瀏覽器中輸入http://localhost:5000/weatherforecast

有看到WeatherForecast回傳的json物件列表,表示建置沒問題

安裝SqlSugarCore套件

接著安裝SqlSugarCore套件

1
dotnet add package SqlSugarCore

安裝MysqlConnector套件

因筆者使用的是MySql資料庫,官方教學文件就有提到MySql必須安裝相對應的MySqlConnector

1
dotnet add package MySqlConnector

註冊SqlSugarClient

接著準備好連線字串,直接宣告於appsettings.development.json

1
2
3
"ConnectionStrings": {
"ClassicModels": "Server=localhost;Database=classicmodels;Uid=root;Pwd=!QAZ2wsx;"
}

於Startup中註冊其SqlSugarClient

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void ConfigureServices(IServiceCollection services)
{

// 以上省略
services.AddTransient(provider =>
{
return new SqlSugarClient(new ConnectionConfig()
{
ConnectionString =Configuration.GetConnectionString("ClassicModels"),//连接符字串
DbType = DbType.MySql, //数据库类型
IsAutoCloseConnection = true //不设成true要手动close
});
});
}

設置起來,超簡單的,筆者直接使用簡單易用的AutoCloseConnection模式,只要填入相對應的ConnectionString,因支援多種資料庫,告訴SqlSugar說使用哪套資料庫,完畢,跟著筆者測試看看吧。

注入SqlSugarClient

首先建立一個測試用API:CustomerController

1
2
3
4
5
6
7
8
9
10
11
using Microsoft.AspNetCore.Mvc;

namespace Demo.ORM.API.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class CustomerController:ControllerBase
{

}
}

就這樣先空著吧,再慢慢填入程式碼,以這樣的Route設置,等等Postman測試時使用api/customer即可,接著宣告並注入SqlSugarClient實體

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using Microsoft.AspNetCore.Mvc;
using SqlSugar;

namespace Demo.ORM.API.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class CustomerController : ControllerBase
{
private readonly SqlSugarClient _db;

public CustomerController(SqlSugarClient db)
{
_db = db;
}
}
}

實作查詢

筆者為示範,就不用在分層什麼的了,直接將查詢語法實作於Controller中

建立Customer資料表對應之Model

建立一個Models資料夾,並新增一個Customers.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
namespace Demo.ORM.API.Models
{
public class Customers
{
public int CustomerNumber { get; set; }
public string CustomerName { get; set; }
public string ContactLastName { get; set; }
public string ContactFirstName { get; set; }
public string Phone { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string PostalCode { get; set; }
public string Country { get; set; }
public int? SalesRepEmployeeNumber { get; set; }
public decimal CreditLimit { get; set; }
}
}

實際撰寫查詢語法

實際於Action中撰寫查詢語法,筆者這邊使用上面步驟所注入之SqlSugarClient實體,使用Queryable方法取得客戶資料,可以使用Select取得特定欄位或物件,最後ToList才做真正查詢作業

1
2
3
4
5
6
7
8
9
10
/// <summary>
/// 查詢客戶國家清單
/// </summary>
/// <returns></returns>
[ProducesResponseType(typeof(List<Customers>), StatusCodes.Status200OK)]
[HttpPost("")]
public IActionResult GetCustomers()
{
return Ok(_db.Queryable<Customers>().Select(x => x.Country).Distinct().ToList());
}

查詢結果

實際使用Postman做查詢,連結為http://localhost:5000/api/customer,使用HttpPost,並按下送出,就會看到結果了

結論

這篇就以這樣簡單介紹使用方式了,筆者留個伏筆吧,Chloe雖好用,但對於筆者常接觸到的工作環境基本上都是DBFirst的方式設計資料結構為主,對於程式端中建立資料庫中的表對應之Model,手動建立則著實費力,SqlSugar提供自動產生的程式碼,若妥善利用並加以包裝,也一樣會享有EFCorescaffold一樣的服務喔,下一篇就教學自動建立資料庫對應物件的方法吧,敬請期待。

參考