.Net Core3.0 WebApi 六: Sqlsugar+異步泛型倉儲


.Net Core3.0 WebApi 目錄

SqlSugar介紹

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

SqlSugar的優點:

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

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

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

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

5、創新、持續更新 ,向下兼容

此篇博客,我就不實際連接數據庫了。寫一些假數據放在這里。

Repository 和Model層中引入SqlSugar

 

 在數據庫中新建一個UserNew表格,然后再Models層中對應的實體類:

///<summary>
///用戶表
///</summary>
[SugarTable("UserNew")]
public partial class UserNew
{
    /// <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; }

在基礎設施層封裝一個數據庫上下文:

 public sealed class SugarDbContext
 {
     public static SqlSugarClient Instance //注意當前方法的類不能是靜態的 public static class這么寫是錯誤的
     {
         get
         {
             var db = new SqlSugarClient(new ConnectionConfig()
             {
                 ConnectionString = "數據庫連接,放在配置文件中",
                 DbType = DbType.SqlServer,
                 //IsAutoCloseConnection = true,
                 InitKeyType = InitKeyType.Attribute
             });

             db.Aop.OnLogExecuting = (sql, pars) =>
             {
                 Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
                 Console.WriteLine();
             };

             return db;
         }
     }

 }

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

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

namespace WebApi.Core.IRepository
{
    /// <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 : IBaseRepository<UserNew>
{
}

對倉儲基接口進行實現

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

namespace WebApi.Core.Repository
{
    public class BaseRepository<TEntity> : IBaseRepository<TEntity> where TEntity : class, new()
    {
        /// <summary>
        /// 寫入實體數據
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task<bool> Add(TEntity model)
        {
            using var dbcontext = SugarDbContext.Instance;
            var i = await Task.Run(() => dbcontext.Insertable(model).ExecuteReturnBigIdentity());
            //返回的i是long類型,這里你可以根據你的業務需要進行處理
            return i > 0;
        }

        /// <summary>
        /// 根據ID刪除
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        public async Task<bool> DeleteByIds(object[] ids)
        {
            using var dbcontext = SugarDbContext.Instance;
            var i = await Task.Run(() => dbcontext.Deleteable<TEntity>().In(ids).ExecuteCommand());
            return i > 0;
        }

        /// <summary>
        /// 根據ID查詢一條數據
        /// </summary>
        /// <param name="objId"></param>
        /// <returns></returns>
        public async Task<TEntity> QueryByID(object objId)
        {
            using var dbcontext = SugarDbContext.Instance;
            return await Task.Run(() => dbcontext.Queryable<TEntity>().InSingle(objId));
        }

        /// <summary>
        /// 更新實體數據
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task<bool> Update(TEntity model)
        {
            using var dbcontext = SugarDbContext.Instance;
            //這種方式會以主鍵為條件
            var i = await Task.Run(() => dbcontext.Updateable(model).ExecuteCommand());
            return i > 0;
        }
    }
}
Repository層新建UserRepository,繼承BaseRepository和IUserRepository
 public class UserRepository : BaseRepository<UserNew>, 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 基類

namespace WebApi.Core.Services.Base
{
    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 : IBaseServices<UserNew>
 {

 }

Service 層新建UserService,繼承BaseService和IUserService

public class UserService : BaseServices<UserNew>, IUserService
{

}

控制器里面新增接口:

/// <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();
    UserNew user = await userService.QueryByID(id);
    return Ok(user);
}


/// <summary>
/// 添加數據
/// </summary>
/// <param name="user">參數user</param>
/// <returns></returns>
[HttpGet("{id}", Name = "Get")]
public async Task<IActionResult> Add(UserNew user)
{
    IUserService userService = new UserService();
    var count = await userService.Add(user);
    return Ok(count);
}

/// <summary>
/// 更新數據
/// </summary>
/// <param name="user">參數user</param>
/// <returns></returns>
[HttpGet("{id}", Name = "Get")]
public async Task<IActionResult> Update(UserNew user)
{
    IUserService userService = new UserService();
    var sucess = await userService.Update(user);
    return Ok(sucess);
}

/// <summary>
/// 刪除數據
/// </summary>
/// <param name="ids">參數ids</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);
}

倉儲模式,一般使用sqlsugar的倉儲就夠了,http://www.donet5.com/Home/Doc?typeId=1228

接口,可自行調試。


免責聲明!

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



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