.Net Core3.0 WebApi 項目框架搭建 五: 輕量型ORM+異步泛型倉儲

.Net Core3.0 WebApi 項目框架搭建:目錄

 

SqlSugar介紹

 

SqlSugar是國人開發者開發的一款基於.NET的ORM框架,是能夠運行在.NET 4.+ & .NET CORE的高性能、輕量級 ORM框架,衆多.NET框架中最容易使用的數據庫訪問技術。官網http://www.codeisbug.com/Doc/8html

 

SqlSugar的優勢:git

 

一、高性能 ,不誇張的說,去掉Sql在數據庫執行的時間,SqlSugar是EF數倍性能,另外在批量操做和一對多查詢上也有不錯的SQL優化github

 

二、高擴展性 ,支持自定義拉姆達函數解析、擴展數據類型、支持自定義實體特性,外部緩存等sql

 

三、穩定性和技術支持,  雖然不是官方ORM, 但在穩定性上也是有着數年用戶積累,若是遇到問題能夠在GITHUB提出來,會根據緊急度按期解決數據庫

 

四、功能全面,雖然SqlSugar小巧可功能並不遜色於EF框架api

 

五、創新、持續更新 ,向下兼容緩存

建立數據庫

這裏採用DB First的模式,先新建一個數據庫,而後新建一張User表,這裏比較簡單,記得表字段添加註釋說明。框架

 

使用代碼生成器生成數據庫鏈接文件和實體類

下載地址 :https://github.com/sunkaixuan/SoEasyPlatform異步

用法很是簡單async

一、下載項目

二、解壓項目

三、點擊解決方案打開項目

image.png

四、配置鏈接字符串名稱、數據庫類型和解決方案名稱

 五、F5運行該項目

 

6.生成成功 

 Repository 和Model層中引入SqlSugar

直接在類庫中經過Nuget引入 sqlSugarCore或者經過Install-Package sqlSugarCore安裝

刪除原來Model層的的User.cs將代碼生成器生成的實體放到model層的enity文件夾

using System; using System.Linq; using System.Text; using SqlSugar; namespace Webapi.Core.Model.Enity { ///<summary>
    ///用戶表 ///</summary>
    [SugarTable("User")] public partial class User { public User() { } /// <summary>
        /// Desc:用戶ID /// Default: /// Nullable:False /// </summary>           
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int UserId { get; set; } /// <summary>
        /// Desc:用戶名 /// Default: /// Nullable:True /// </summary>           
        public string UserName { get; set; } /// <summary>
        /// Desc:年齡 /// Default: /// Nullable:True /// </summary>           
        public int? Age { get; set; } } }

Repository層新建suger文件夾,將生成的DBConext.cs放置進去,裏面已經內置了增刪改查等方法,能夠刪除掉這些方法,後面咱們本身使用異步實現,仍是很方便的,不過,若是要使用異步,就要異步到底,否則就會阻塞,變成了同步。

using Webapi.Core.Model.Entity; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; public class DbContext<T> where T : class, new() { public DbContext() { Db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = "server=.;uid=sa;pwd=sa123;database=CoreDB", 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<T> CurrentDb { get { return new SimpleClient<T>(Db); } }//用來操做當前表的數據

   public SimpleClient<User> UserDb { get { return new SimpleClient<User>(Db); } }//用來處理User表的經常使用操做


   /// <summary>
    /// 獲取全部 /// </summary>
    /// <returns></returns>
    public virtual List<T> GetList() { return CurrentDb.GetList(); } /// <summary>
    /// 根據表達式查詢 /// </summary>
    /// <returns></returns>
    public virtual List<T> GetList(Expression<Func<T, bool>> whereExpression) { return CurrentDb.GetList(whereExpression); } /// <summary>
    /// 根據表達式查詢分頁 /// </summary>
    /// <returns></returns>
    public virtual List<T> GetPageList(Expression<Func<T, bool>> whereExpression, PageModel pageModel) { return CurrentDb.GetPageList(whereExpression, pageModel); } /// <summary>
    /// 根據表達式查詢分頁並排序 /// </summary>
    /// <param name="whereExpression">it</param>
    /// <param name="pageModel"></param>
    /// <param name="orderByExpression">it=>it.id或者it=>new{it.id,it.name}</param>
    /// <param name="orderByType">OrderByType.Desc</param>
    /// <returns></returns>
    public virtual List<T> GetPageList(Expression<Func<T, bool>> whereExpression, PageModel pageModel, Expression<Func<T, object>> orderByExpression = null, OrderByType orderByType = OrderByType.Asc) { return CurrentDb.GetPageList(whereExpression, pageModel,orderByExpression,orderByType); } /// <summary>
    /// 根據主鍵查詢 /// </summary>
    /// <returns></returns>
    public virtual T GetById(dynamic id) { return CurrentDb.GetById(id); } /// <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 Delete(T data) { return CurrentDb.Delete(data); } /// <summary>
    /// 根據主鍵刪除 /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public virtual bool Delete(dynamic[] ids) { return CurrentDb.AsDeleteable().In(ids).ExecuteCommand()>0; } /// <summary>
    /// 根據表達式刪除 /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public virtual bool Delete(Expression<Func<T, bool>> whereExpression) { return CurrentDb.Delete(whereExpression); } /// <summary>
    /// 根據實體更新,實體須要有主鍵 /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public virtual bool Update(T obj) { return CurrentDb.Update(obj); } /// <summary>
    ///批量更新 /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public virtual bool Update(List<T> objs) { return CurrentDb.UpdateRange(objs); } /// <summary>
    /// 插入 /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public virtual bool Insert(T obj) { return CurrentDb.Insert(obj); } /// <summary>
    /// 批量 /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public virtual bool Insert(List<T> objs) { return CurrentDb.InsertRange(objs); } //自已擴展更多方法 
}

這裏的ConnectionString是數據庫鏈接字符串,咱們能夠寫在配置文件裏面,sugar新建BaseDBConfig.cs

public class BaseDBConfig { /// <summary>
        /// 數據庫鏈接字符串 /// </summary>
        public static string ConnectionString { get; set; } }

修改DbContext的構造函數

Db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = BaseDBConfig.ConnectionString, DbType = DbType.SqlServer, InitKeyType = InitKeyType.Attribute,//從特性讀取主鍵和自增列信息
            IsAutoCloseConnection = true,//開啓自動釋放模式和EF原理同樣我就很少解釋了
 });

在 startup.cs 中的 ConfigureServices() 方法中添加

//數據庫配置
            BaseDBConfig.ConnectionString = Configuration.GetSection("AppSettings:ConnectionString").Value;

設計倉儲基類接口——IBaseRepository.cs

IRepository 層中添加Base文件夾,並添加接口 IBaseRepository.cs。

using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; namespace Webapi.Core.IRepository.Base { /// <summary>
    /// 基類接口,其餘接口繼承該接口 /// </summary>
    /// <typeparam name="TEntity"></typeparam>
   public interface IBaseRepository<TEntity> where TEntity : class { /// <summary>
        /// 根據ID查詢 /// </summary>
        /// <param name="objId"></param>
        /// <returns></returns>
        Task<TEntity> QueryByID(object objId); /// <summary>
        /// 添加 /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        Task<bool> Add(TEntity model); /// <summary>
        /// 修改 /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        Task<bool> Update(TEntity model); /// <summary>
        /// 刪除 /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        Task<bool> DeleteByIds(object[] ids); } }

繼承基接口

IRepository 層中,將其餘的接口,繼承Base,新建IUserRepository.cs,而後將其餘全部的方法都繼承該基類方法

 public interface IUserRepository : IBaseRepositoryy<User> { }

對倉儲基接口進行實現

Repository 層中,添加Base文件夾,並添加 BaseRepository.cs 基類

public class BaseRepository<TEntity> : DbContext<TEntity>, IBaseRepository<TEntity> where TEntity : class, new() { /// <summary>
        /// 寫入實體數據 /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task<bool> Add(TEntity model) { var i = await Task.Run(() => Db.Insertable(model).ExecuteReturnBigIdentity()); //返回的i是long類型,這裏你能夠根據你的業務須要進行處理
            return i; } /// <summary>
        /// 根據ID刪除 /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        public async Task<bool> DeleteByIds(object[] ids) { var i = await Task.Run(() => Db.Deleteable<TEntity>().In(ids).ExecuteCommand()); return i > 0; } /// <summary>
        /// 根據ID查詢一條數據 /// </summary>
        /// <param name="objId"></param>
        /// <returns></returns>
        public async Task<TEntity> QueryByID(object objId) { return await Task.Run(() => Db.Queryable<TEntity>().InSingle(objId)); } /// <summary>
        /// 更新實體數據 /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task<bool> Update(TEntity model) { //這種方式會以主鍵爲條件
            var i = await Task.Run(() => Db.Updateable(model).ExecuteCommand()); return i > 0; }
Repository層新建UserRepository,繼承BaseRepository和IUserRepository
public class UserRepository : BaseRepository<User>, IUserRepository { }

業務邏輯層基類與基接口

IService 層中添加Base文件夾,並添加接口 IBaseService.cs。

public interface IBaseServices<TEntity> where TEntity : class { /// <summary>
        /// 根據ID列表刪除 /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        Task<bool> DeleteByIds(object[] ids); /// <summary>
        /// 根據ID查詢 /// </summary>
        /// <param name="objId"></param>
        /// <returns></returns>
        Task<TEntity> QueryByID(object objId); /// <summary>
        /// 添加實體 /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        Task<bool> Add(TEntity model); /// <summary>
        /// 更新實體 /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
 Task<bool> Update(TEntity model); }

Service 層中添加Base文件夾,並添加接口 BaseService.cs。並添加 BaseService.cs 基類

public class BaseServices<TEntity> : IBaseServices<TEntity> where TEntity : class, new() { public IBaseRepository<TEntity> baseDal = new BaseRepository<TEntity>(); /// <summary>
        /// 寫入實體 /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task<bool> Add(TEntity model) { return await baseDal.Add(model); } /// <summary>
        /// 根據ID刪除 /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>

        public async Task<bool> DeleteByIds(object[] ids) { return await baseDal.DeleteByIds(ids); } /// <summary>
        /// 根據ID查詢 /// </summary>
        /// <param name="objId"></param>
        /// <returns></returns>
        public async Task<TEntity> QueryByID(object objId) { return await baseDal.QueryByID(objId); } /// <summary>
        /// 更新實體 /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task<bool> Update(TEntity model) { return await baseDal.Update(model); } }

IService 層新建IUserService,繼承BaseService

public interface IUserService : IBaseService<User> { }

Service 層新建IUserService,繼承BaseService和IUserService

public class UserService : BaseService<User>, IUserService { }

新增接口

User控制器新增接口:

/// <summary>
        /// 根據id獲取數據 /// </summary>
        /// <param name="id">參數id</param>
        /// <returns></returns>
        [HttpGet("{id}", Name = "Get")] public async Task<IActionResult> GetUser(int id) { IUserService userService = new UserService(); User user = await userService.QueryByID(id); return Ok(user); } /// <summary>
        /// 添加數據 /// </summary>
        /// <param name="id">參數id</param>
        /// <returns></returns>
        [HttpGet("{id}", Name = "Get")] public async Task<IActionResult> Add(User user) { IUserService userService = new UserService(); var count = await userService.Add(user); return Ok(count); } /// <summary>
        /// 更新數據 /// </summary>
        /// <param name="id">參數id</param>
        /// <returns></returns>
        [HttpGet("{id}", Name = "Get")] public async Task<IActionResult> Update(User user) { IUserService userService = new UserService(); var sucess = await userService.Update(user); return Ok(sucess); } /// <summary>
        /// 刪除數據 /// </summary>
        /// <param name="id">參數id</param>
        /// <returns></returns>
        [HttpGet("{id}", Name = "Get")] public async Task<IActionResult> Delete(object[] ids) { IUserService userService = new UserService(); var sucess = await userService.DeleteByIds(ids); return Ok(sucess); }

調試接口

F5運行項目,測試添加接口:

 數據庫成功添加了數據,由於Id用的是自增,因此是1

 測試查詢接口:

 測試修改接口

若是修改不存在的ID,則刪除失敗

 測試刪除接口:

 數據已刪除

 本章Github

 https://github.com/huguodong/Webapi.Core/tree/sqlsugar/

相關文章
相關標籤/搜索