? ? ? ?
目錄
1.添加包
2.配置連接字符串
?3.配置SqlSugar
? ? ? ? 3.1.添加基礎類
? ? ? ? ?3.2.添加方法
? ? ? ? 3.2.1.讀取配置方法
? ? ? ? 3.2.2.枚舉擴展方法? ? ? ?
?????????3.3.添加管理類(重要)
4.配置倉儲
? ? ? ? 4.1.倉儲接口添加
5.注冊
6.使用?
????????該文檔是配置SqlSugar多租戶和加倉儲教程。使用 SqlSugar 添加倉儲層可以帶來多方面的優勢,尤其在提高代碼的可維護性、可測試性和開發效率方面,提升代碼的整體質量,促進團隊合作,并降低維護成本。這對于長期發展的項目來說尤為重要。
1.添加包
? ? ? ? 添加?SqlSugarCore 的NuGet包。
? ? ? ? 操作:點擊打開到要添加的項目 → 依賴項 → 包 → 右鍵點擊 管理NuGet包
→ 搜索?SqlSugarCore → 安裝
2.配置連接字符串
? ? ? ? 點擊到添加的項目 → 右鍵添加 → 新建項 → 右上角搜索 json →?修改名字為?dbsettings →添加
? ? ? ? 添加自己的數據庫連接
{//數據庫連接字符串"ConnectionStrings": {"DefaultDbString": "Server=你的數據庫地址;Port=數據庫端口;Database=數據庫名稱;User ID=用戶;Password=密碼;SslMode=Required;","DefaultDbNumber": 0,"DefaultDbType": "MySql","DbConfigs": [{"DbNumber": "1","DbType": "SqlServer","DbString": "Server=你的數據庫地址;Initial Catalog=數據庫名稱;User ID=用戶;Password=密碼;Encrypt=True;TrustServerCertificate=True;"},{"DbNumber": 2,"DbType": "MySql","DbString": "Server=你的數據庫地址;Port=數據庫端口;Database=數據庫名稱;User ID=用戶;Password=密碼;SslMode=Required;"}]}
}
? ? ? ? 案例如下
?3.配置SqlSugar
? ? ? ? 3.1.添加基礎類
? ? ? ? 添加?DbConnEnum 枚舉、ConnectionStringsOptions 類、DbConfig 類
public enum DbConnEnum{/// <summary>/// SqlServer/// </summary>[Description("Mysql")]Default = 0,/// <summary>/// Mysql/// </summary>[Description("Sqlserver")]SystemSqlserver = 1,/// <summary>/// Mysql/// </summary>[Description("Mysql")]SystemMysql = 2,}/// <summary>/// 數據庫配置/// </summary>public class ConnectionStringsOptions{/// <summary>/// 默認數據庫編號/// </summary>public int DefaultDbNumber { get; set; }/// <summary>/// 默認數據庫類型/// </summary>public string DefaultDbType { get; set; }/// <summary>/// 默認數據庫連接字符串/// </summary>public string DefaultDbString { get; set; }/// <summary>/// 業務庫集合/// </summary>public List<DbConfig> DbConfigs { get; set; }}/// <summary>/// 數據庫參數/// </summary>public class DbConfig{/// <summary>/// 數據庫編號/// </summary>public string DbNumber { get; set; }/// <summary>/// 數據庫類型/// </summary>public string DbType { get; set; }/// <summary>/// 數據庫連接字符串/// </summary>public string DbString { get; set; }}
? ? ? ? 案例如下
?
? ? ? ? ?3.2.添加方法
? ? ? ? 3.2.1.讀取配置方法
? ? ? ? 添加獲取配置方法
/// <summary>/// 全局配置/// </summary>public static class Config{/// <summary>/// 從指定的 JSON 配置文件中讀取配置,并反序列化為指定類型/// </summary>/// <typeparam name="T">目標配置類型(如 RedisSettings、DatabaseSettings 等)</typeparam>/// <param name="fileName">JSON 配置文件名(如 "appsettings.json")</param>/// <param name="sessions">配置節點名稱(如 "RedisSettings")</param>/// <returns>返回綁定后的強類型配置對象</returns>public static T GetSetting<T>(string fileName, string sessions){//創建 ConfigurationBuilder 實例,用于構建配置var builder = new ConfigurationBuilder()//設置配置文件的基礎路徑為當前程序運行目錄.SetBasePath(Directory.GetCurrentDirectory())//添加 JSON 文件作為配置源://- fileName: 指定要加載的 JSON 文件//- optional: false 表示文件必須存在,否則拋出異常//- reloadOnChange: true 表示文件修改時自動重新加載.AddJsonFile(fileName, optional: false, reloadOnChange: true);//構建配置對象(IConfigurationRoot)IConfigurationRoot config = builder.Build();//獲取指定配置節點(sessions),并將其反序列化為類型 Tvar conn = config.GetSection(sessions).Get<T>();//返回反序列化后的配置對象return conn;}}
? ? ? ? 案例如下
? ? ? ? 3.2.2.枚舉擴展方法? ? ? ?
????????添加枚舉擴展方法方便擴展枚舉
/// <summary>/// 枚舉擴展/// </summary>public static class EnumExtesion{/// <summary>/// 枚舉擴展方法 - 獲取枚舉值的Description特性描述/// </summary>/// <param name="value">枚舉值</param>/// <returns>描述內容</returns>public static string Description(this Enum value){// 參數驗證if (value == null)throw new ArgumentNullException(nameof(value));// 獲取枚舉類型的字段信息FieldInfo fi = value.GetType().GetField(value.ToString());// 獲取字段上的DescriptionAttribute特性數組DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), // 要查找的特性類型false // 不搜索繼承鏈);// 如果有Description特性則返回其描述,否則返回枚舉字符串return attributes.Length > 0 ? attributes[0].Description : value.ToString();}}
? ? ? ? 案例如下
?????????3.3.添加管理類(重要)
????????????????SqlSugar數據庫上下文管理類,用于管理多數據庫連接實例
using Frame4_LibraryCore.BaseConfig;
using Frame6_LibraryUtility.Enum;
using Microsoft.Extensions.Configuration;
using SqlSugar;
using DbType = SqlSugar.DbType;namespace Frame3_DataRepository.SqlSugarRepository
{/// <summary>/// SqlSugar數據庫上下文管理類,用于管理多數據庫連接實例/// </summary>public class DatabaseSqlSugar{/// <summary>/// 數據庫連接字典,按數據庫編號存儲SqlSugarScope實例/// Key: 數據庫編號(int)/// Value: SqlSugarScope實例/// </summary>private readonly Dictionary<int, SqlSugarScope> _dbs = new();/// <summary>/// 主數據庫實例(默認操作使用的數據庫)/// </summary>public ISqlSugarClient MainDb { get; private set; }/// <summary>/// 構造函數,初始化數據庫連接/// </summary>/// <param name="configuration">配置接口,用于獲取連接字符串</param>public DatabaseSqlSugar(IConfiguration configuration){// 從配置文件獲取數據庫連接配置var connectionStringOption = Config.GetSetting<ConnectionStringsOptions>("dbsettings.json", "ConnectionStrings");// 添加默認數據庫連接AddDatabase(connectionStringOption.DefaultDbNumber, connectionStringOption.DefaultDbType, connectionStringOption.DefaultDbString);// 添加其他配置的數據庫連接if (connectionStringOption.DbConfigs != null){foreach (var config in connectionStringOption.DbConfigs){AddDatabase(int.Parse(config.DbNumber), config.DbType, config.DbString);}}// 設置主數據庫實例MainDb = _dbs[connectionStringOption.DefaultDbNumber];}/// <summary>/// 添加數據庫連接/// </summary>/// <param name="dbNumber">數據庫編號</param>/// <param name="dbType">數據庫類型字符串</param>/// <param name="connectionString">連接字符串</param>private void AddDatabase(int dbNumber, string dbType, string connectionString){// 創建SqlSugarScope實例var db = new SqlSugarScope(new ConnectionConfig(){ConnectionString = connectionString,DbType = (DbType)Enum.Parse(typeof(DbType), dbType), // 轉換數據庫類型枚舉IsAutoCloseConnection = true, // 啟用自動關閉連接InitKeyType = InitKeyType.Attribute // 使用特性方式初始化主鍵});// 綁定AOP事件BindAopEvents(db, dbNumber);// 添加到數據庫字典_dbs[dbNumber] = db;}/// <summary>/// 根據實體類型獲取對應的數據庫實例/// </summary>/// <typeparam name="TEntity">實體類型</typeparam>/// <returns>對應的SqlSugarClient實例</returns>/// <exception cref="KeyNotFoundException">當找不到對應的數據庫時拋出</exception>public ISqlSugarClient GetDbByEntity<TEntity>(){var type = typeof(TEntity);// 獲取實體上的Tenant特性(用于多租戶/分庫)var tenantAttr = (TenantAttribute)Attribute.GetCustomAttribute(type, typeof(TenantAttribute));// 獲取數據庫編號,默認為0int dbNumber = (int)tenantAttr.configId != 0 ? (int)tenantAttr.configId : 0;if (_dbs.TryGetValue(dbNumber, out var db)){// 確保AOP事件已綁定BindAopEvents(db, dbNumber);return db;}throw new KeyNotFoundException($"找不到編號為 {dbNumber} 的數據庫連接");}/// <summary>/// 綁定AOP事件(主要用于SQL日志記錄)/// </summary>/// <param name="db">SqlSugarClient實例</param>/// <param name="dbNumber">數據庫編號</param>private void BindAopEvents(ISqlSugarClient db, int dbNumber){// SQL執行完成事件db.Aop.OnLogExecuted = (sql, pars) =>{// 根據SQL類型設置不同顏色if (sql.TrimStart().StartsWith("SELECT", StringComparison.OrdinalIgnoreCase)){Console.ForegroundColor = ConsoleColor.Green; // 查詢語句用綠色}else if (sql.TrimStart().StartsWith("DELETE", StringComparison.OrdinalIgnoreCase)){Console.ForegroundColor = ConsoleColor.Red; // 刪除語句用紅色}else{Console.ForegroundColor = ConsoleColor.Blue; // 其他語句用藍色}// 構建完整SQL(替換參數)string completeSql = sql;if (pars != null && pars.Length > 0){Dictionary<string, object> parameterValues = new();foreach (var p in pars){parameterValues[p.ParameterName] = p.Value;}foreach (var kvp in parameterValues){completeSql = completeSql.Replace(kvp.Key, FormatParameterValue(kvp.Value));}}// 輸出SQL日志Console.WriteLine($"【Sql時間】:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}\r\n" +$"【Sql庫號】:{((DbConnEnum)dbNumber).Description()} \r\n" +$"【Sql語句】:{completeSql} \r\n" +$"【Sql耗時】: {db.Ado.SqlExecutionTime.TotalMilliseconds:F2} 毫秒\r\n");};}/// <summary>/// 關閉所有數據庫連接/// </summary>public void CloseAllConnections(){foreach (var db in _dbs.Values){db.Dispose(); // 釋放數據庫連接資源}}/// <summary>/// 格式化參數值,用于SQL日志輸出/// </summary>/// <param name="value">參數值</param>/// <returns>格式化后的字符串</returns>private static string FormatParameterValue(object value){if (value is string stringValue){return $"'{stringValue}'"; // 字符串類型加引號}else if (value is DateTime dateTimeValue){return $"'{dateTimeValue.ToString("yyyy-MM-dd HH:mm:ss")}'"; // 日期時間格式化}else if (value is bool boolValue){return boolValue ? "1" : "0"; // 布爾值轉數字}else{return value?.ToString() ?? "NULL"; // 其他類型直接轉字符串,null值轉為NULL}}}
}
? ? ? ? ?案例如下
4.配置倉儲
? ? ? ??基于SqlSugar的通用倉儲實現類,提供對實體TEntity的CRUD操作及基礎查詢功能
using SqlSugar;
using System.Linq.Expressions;namespace Frame3_DataRepository.SqlSugarRepository
{/// <summary>/// 基于SqlSugar的通用倉儲實現類/// 提供對實體TEntity的CRUD操作及基礎查詢功能/// </summary>/// <typeparam name="TEntity">實體類型,必須是引用類型且有公共無參構造函數</typeparam>public class SqlSugarRepository<TEntity> : ISqlSugarRepository<TEntity> where TEntity : class, new(){/// <summary>/// 數據庫工廠實例,用于獲取數據庫連接/// </summary>private readonly DatabaseSqlSugar _dbFactory;/// <summary>/// 構造函數,通過依賴注入初始化數據庫工廠/// </summary>/// <param name="dbFactory">數據庫工廠實例</param>public SqlSugarRepository(DatabaseSqlSugar dbFactory){_dbFactory = dbFactory;}/// <summary>/// 當前實體對應的數據庫客戶端/// 根據實體上的TenantAttribute自動選擇對應的數據庫/// </summary>protected ISqlSugarClient _db => _dbFactory.GetDbByEntity<TEntity>();/// <summary>/// 實體查詢集合(延遲加載)/// 可用于構建復雜查詢/// </summary>public virtual ISugarQueryable<TEntity> Entities => _db.Queryable<TEntity>();#region 查詢方法/// <summary>/// 根據條件表達式獲取第一條記錄/// </summary>/// <param name="whereExpression">查詢條件表達式</param>/// <returns>符合條件的第一條記錄,若無則返回null</returns>public TEntity First(Expression<Func<TEntity, bool>> whereExpression){return _db.Queryable<TEntity>().First(whereExpression);}/// <summary>/// 異步獲取符合條件的第一條記錄/// </summary>/// <param name="whereExpression">查詢條件表達式</param>/// <returns>包含查詢結果的Task</returns>public async Task<TEntity> FirstAsync(Expression<Func<TEntity, bool>> whereExpression){return await _db.Queryable<TEntity>().FirstAsync(whereExpression);}/// <summary>/// 獲取所有記錄列表/// </summary>/// <returns>實體列表</returns>public List<TEntity> ToList(){return _db.Queryable<TEntity>().ToList();}/// <summary>/// 異步獲取所有記錄列表/// </summary>/// <returns>包含實體列表的Task</returns>public async Task<List<TEntity>> ToListAsync(){return await _db.Queryable<TEntity>().ToListAsync();}/// <summary>/// 根據主鍵ID獲取實體/// 默認查找名為"Id"的屬性作為主鍵/// </summary>/// <param name="id">主鍵值</param>/// <returns>對應實體</returns>/// <exception cref="InvalidOperationException">當實體沒有Id屬性時拋出</exception>public TEntity GetById(object id){var keyProperty = typeof(TEntity).GetProperty("Id");if (keyProperty == null)throw new InvalidOperationException($"實體{typeof(TEntity).Name}不包含Id屬性");return _db.Queryable<TEntity>().First(it => keyProperty.GetValue(it).Equals(id));}/// <summary>/// 異步根據主鍵ID獲取實體/// </summary>/// <param name="id">主鍵值</param>/// <returns>包含查詢結果的Task</returns>public async Task<TEntity> GetByIdAsync(object id){var keyProperty = typeof(TEntity).GetProperty("Id");if (keyProperty == null)throw new InvalidOperationException($"實體{typeof(TEntity).Name}不包含Id屬性");return await _db.Queryable<TEntity>().FirstAsync(it => keyProperty.GetValue(it).Equals(id));}#endregion#region 新增方法/// <summary>/// 插入單個實體/// </summary>/// <param name="entity">要插入的實體</param>/// <returns>影響的行數</returns>public int Insert(TEntity entity){return _db.Insertable(entity).ExecuteCommand();}/// <summary>/// 批量插入實體集合/// </summary>/// <param name="entity">實體集合</param>/// <returns>影響的行數</returns>public int Insert(List<TEntity> entity){return _db.Insertable(entity).ExecuteCommand();}/// <summary>/// 異步插入單個實體/// </summary>/// <param name="entity">要插入的實體</param>/// <returns>包含影響行數的Task</returns>public async Task<int> InsertAsync(TEntity entity){return await _db.Insertable(entity).ExecuteCommandAsync();}/// <summary>/// 異步批量插入實體集合/// </summary>/// <param name="entity">實體集合</param>/// <returns>包含影響行數的Task</returns>public async Task<int> InsertAsync(List<TEntity> entity){return await _db.Insertable(entity).ExecuteCommandAsync();}#endregion#region 更新方法/// <summary>/// 更新單個實體/// 自動忽略null值和默認值字段/// </summary>/// <param name="entity">要更新的實體</param>/// <returns>影響的行數</returns>public int Update(TEntity entity){return _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true, ignoreAllDefaultValue: true).ExecuteCommand();}/// <summary>/// 批量更新實體集合/// </summary>/// <param name="entity">實體集合</param>/// <returns>影響的行數</returns>public int Update(List<TEntity> entity){return _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true, ignoreAllDefaultValue: true).ExecuteCommand();}/// <summary>/// 異步更新單個實體/// </summary>/// <param name="entity">要更新的實體</param>/// <returns>包含影響行數的Task</returns>public async Task<int> UpdateAsync(TEntity entity){return await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true, ignoreAllDefaultValue: true).ExecuteCommandAsync();}/// <summary>/// 異步批量更新實體集合/// </summary>/// <param name="entity">實體集合</param>/// <returns>包含影響行數的Task</returns>public async Task<int> UpdateAsync(List<TEntity> entity){return await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true, ignoreAllDefaultValue: true).ExecuteCommandAsync();}/// <summary>/// 高性能批量更新/// </summary>/// <param name="entity">實體集合</param>/// <returns>影響的行數</returns>/// <exception cref="ArgumentException">當實體集合為空時拋出</exception>public int BulkUpdate(List<TEntity> entity){if (entity == null || !entity.Any())throw new ArgumentException("更新實體集合不能為空");return _db.Fastest<TEntity>().BulkUpdate(entity);}/// <summary>/// 異步高性能批量更新/// </summary>/// <param name="entity">實體集合</param>/// <returns>包含影響行數的Task</returns>public async Task<int> BulkUpdateAsync(List<TEntity> entity){if (entity == null || !entity.Any())throw new ArgumentException("更新實體集合不能為空");return await _db.Fastest<TEntity>().BulkUpdateAsync(entity);}#endregion#region 刪除方法/// <summary>/// 根據主鍵ID刪除記錄/// </summary>/// <param name="id">主鍵值</param>/// <returns>影響的行數</returns>/// <exception cref="InvalidOperationException">當實體沒有Id屬性時拋出</exception>public int DeleteById(object id){var keyProperty = typeof(TEntity).GetProperty("Id");if (keyProperty == null)throw new InvalidOperationException($"實體{typeof(TEntity).Name}不包含Id屬性");var expression = Expression.Lambda<Func<TEntity, bool>>(Expression.Equal(Expression.Property(Expression.Parameter(typeof(TEntity), "it"), "Id"),Expression.Constant(id)),new[] { Expression.Parameter(typeof(TEntity), "it") });return _db.Deleteable<TEntity>().Where(expression).ExecuteCommand();}/// <summary>/// 異步根據主鍵ID刪除記錄/// </summary>/// <param name="id">主鍵值</param>/// <returns>包含影響行數的Task</returns>public async Task<int> DeleteByIdAsync(object id){var keyProperty = typeof(TEntity).GetProperty("Id");if (keyProperty == null)throw new InvalidOperationException($"實體{typeof(TEntity).Name}不包含Id屬性");var expression = Expression.Lambda<Func<TEntity, bool>>(Expression.Equal(Expression.Property(Expression.Parameter(typeof(TEntity), "it"), "Id"),Expression.Constant(id)),new[] { Expression.Parameter(typeof(TEntity), "it") });return await _db.Deleteable<TEntity>().Where(expression).ExecuteCommandAsync();}#endregion#region 查詢構造器/// <summary>/// 根據條件表達式構建查詢/// </summary>/// <param name="predicate">查詢條件</param>/// <returns>可繼續構建的查詢對象</returns>public virtual ISugarQueryable<TEntity> Where(Expression<Func<TEntity, bool>> predicate){return AsQueryable(predicate);}/// <summary>/// 根據條件構建查詢/// 當condition為true時應用predicate條件/// </summary>/// <param name="condition">是否應用條件</param>/// <param name="predicate">查詢條件</param>/// <returns>可繼續構建的查詢對象</returns>public virtual ISugarQueryable<TEntity> Where(bool condition, Expression<Func<TEntity, bool>> predicate){return AsQueryable().WhereIF(condition, predicate);}/// <summary>/// 獲取基礎查詢構造器/// </summary>/// <returns>可繼續構建的查詢對象</returns>public virtual ISugarQueryable<TEntity> AsQueryable(){return Entities;}/// <summary>/// 根據條件獲取查詢構造器/// </summary>/// <param name="predicate">查詢條件</param>/// <returns>可繼續構建的查詢對象</returns>public virtual ISugarQueryable<TEntity> AsQueryable(Expression<Func<TEntity, bool>> predicate){return Entities.Where(predicate);}#endregion#region 事務管理/// <summary>/// 在當前數據庫開啟事務/// </summary>public void CurrentBeginTran(){_db.AsTenant().BeginTran();}/// <summary>/// 提交當前數據庫事務/// </summary>public void CurrentCommitTran(){_db.AsTenant().CommitTran();}/// <summary>/// 回滾當前數據庫事務/// </summary>public void CurrentRollbackTran(){_db.AsTenant().RollbackTran();}#endregion}
}
? ? ? ? 案例如下
? ? ? ? 4.1.倉儲接口添加
? ? ? ? 為了更好的使用倉儲,把倉儲的每個方法添加接口。
using SqlSugar;
using System.Linq.Expressions;namespace Frame3_DataRepository.SqlSugarRepository
{/// <summary>/// 倉儲接口/// </summary>/// <typeparam name="TEntity"></typeparam>public interface ISqlSugarRepository<TEntity> where TEntity : class, new(){/// <summary>/// 查詢單條數據/// </summary>/// <param name="whereExpression"></param>/// <returns></returns>TEntity First(Expression<Func<TEntity, bool>> whereExpression);/// <summary>/// 查詢單條數據 (異步)/// </summary>/// <param name="whereExpression"></param>/// <returns></returns>Task<TEntity> FirstAsync(Expression<Func<TEntity, bool>> whereExpression);/// <summary>/// 獲取列表/// </summary>/// <returns></returns>List<TEntity> ToList();/// <summary>/// 獲取列表 (異步)/// </summary>/// <returns></returns>Task<List<TEntity>> ToListAsync();/// <summary>/// 根據Id獲取數據/// </summary>/// <param name="id"></param>/// <returns></returns>/// <exception cref="InvalidOperationException"></exception>TEntity GetById(object id);/// <summary>/// 根據Id獲取數據 (異步)/// </summary>/// <param name="id"></param>/// <returns></returns>/// <exception cref="InvalidOperationException"></exception>Task<TEntity> GetByIdAsync(object id);/// <summary>/// 添加數據/// </summary>/// <param name="entity"></param>/// <returns></returns>int Insert(TEntity entity);/// <summary>/// 批量添加新增數據/// </summary>/// <param name="entity"></param>/// <returns></returns>int Insert(List<TEntity> entity);/// <summary>/// 添加數據 (異步)/// </summary>/// <param name="entity"></param>/// <returns></returns>Task<int> InsertAsync(TEntity entity);/// <summary>/// 批量添加數據 (異步)/// </summary>/// <param name="entity"></param>/// <returns></returns>Task<int> InsertAsync(List<TEntity> entity);/// <summary>/// 修改數據/// </summary>/// <param name="entity"></param>/// <returns></returns>int Update(TEntity entity);/// <summary>/// 批量修改數據/// </summary>/// <param name="entity"></param>/// <returns></returns>int Update(List<TEntity> entity);/// <summary>/// 修改數據 (異步)/// </summary>/// <param name="entity"></param>/// <returns></returns>Task<int> UpdateAsync(TEntity entity);/// <summary>/// 批量修改數據 (異步)/// </summary>/// <param name="entity"></param>/// <returns></returns>Task<int> UpdateAsync(List<TEntity> entity);/// <summary>/// 大批量修改/// </summary>/// <param name="entity"></param>/// <returns></returns>/// <exception cref="ArgumentException"></exception>int BulkUpdate(List<TEntity> entity);/// <summary>/// 大批量修改 (異步)/// </summary>/// <param name="entity"></param>/// <returns></returns>/// <exception cref="ArgumentException"></exception>Task<int> BulkUpdateAsync(List<TEntity> entity);/// <summary>/// 根據Id刪除數據/// </summary>/// <param name="id"></param>/// <returns></returns>/// <exception cref="InvalidOperationException"></exception>int DeleteById(object id);/// <summary>/// 根據Id刪除數據 (異步)/// </summary>/// <param name="id"></param>/// <returns></returns>/// <exception cref="InvalidOperationException"></exception>Task<int> DeleteByIdAsync(object id);/// <summary>/// 根據表達式查詢多條記錄/// </summary>/// <param name="predicate"></param>/// <returns></returns>ISugarQueryable<TEntity> Where(Expression<Func<TEntity, bool>> predicate);/// <summary>/// 根據表達式查詢多條記錄/// </summary>/// <param name="condition"></param>/// <param name="predicate"></param>/// <returns></returns>ISugarQueryable<TEntity> Where(bool condition, Expression<Func<TEntity, bool>> predicate);/// <summary>/// 構建查詢分析器/// </summary>/// <returns></returns>ISugarQueryable<TEntity> AsQueryable();/// <summary>/// 構建查詢分析器/// </summary>/// <param name="predicate"></param>/// <returns></returns>ISugarQueryable<TEntity> AsQueryable(Expression<Func<TEntity, bool>> predicate);}
}
? ? ? ? 案例如下
5.注冊
? ? ? ? 添加好以上后就可以把SqlSugar和倉儲在文件?Program 或?Startup 里注冊。
// 注冊 DatabaseSqlSugar(單例或作用域都可以)builder.Services.AddSingleton<DatabaseSqlSugar>(sp =>{// 假設你有 IConfiguration 可用var configuration = sp.GetRequiredService<IConfiguration>();return new DatabaseSqlSugar(configuration);});// 注冊Sqlsugar倉儲builder.Services.AddScoped(typeof(ISqlSugarRepository<>), typeof(SqlSugarRepository<>));
6.使用?
? ? ? ? 添加 entity 數據庫實體類
using Frame6_LibraryUtility.Enum;
using SqlSugar;namespace Frame2_DataModel.Entity.User
{/// <summary>/// User實體/// </summary>[SugarTable("User", TableDescription = "用戶表"), Tenant((int)DbConnEnum.SystemMysql)]public class UserEntity : BaseEntity{/// <summary>/// 用戶Id主鍵/// </summary>[SugarColumn(IsPrimaryKey = true)]public string Id { get; set; }/// <summary>/// 用戶登錄名/// </summary>public string UserId { get; set; }/// <summary>/// 用戶密碼/// </summary>public string pwd { get; set; }/// <summary>/// 用戶姓名/// </summary>public string UserName { get; set; }public string Age { get; set; }}
}
? ? ? ? 案例如下
? ? ? ? 使用倉儲
public class UserService : BaseService, IUserService{private readonly ISqlSugarRepository<UserEntity> _dbUser;/// <summary>/// 依賴注入/// </summary>/// <param name="sqlSugar"></param>/// <param name="tokenService"></param>/// <param name="iCurrentUser"></param>/// <param name="mapper"></param>public UserService(ISqlSugarRepository<UserEntity> dbUser){_dbUser = dbUser;}/// <summary>/// 獲取所有test/// </summary>/// <returns></returns>public async Task<ResultModel<List<UserEntity>>> GetUserAsync(){var result = new ResultModel<List<UserEntity>>();var users = await _dbUser.ToListAsync();result.Msg = "獲取成功";result.Data = users;return result;}}
? ? ? ? ?案例如下