【后端】配置SqlSugar ORM框架并添加倉儲

? ? ? ?

目錄

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;}}

? ? ? ? ?案例如下

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89654.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89654.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89654.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全國高等院校計算機基礎教育研究會2025學術年會在西寧成功舉辦 ——高原論道啟新程,數智融合育英才

7 月16日至18日&#xff0c;全國高等院校計算機基礎教育研究會2025學術年會在青海西寧隆重召開。大會以“數智融合&#xff0c;創新計算機教育”為主題&#xff0c;匯聚人工智能領域頂尖專家學者、高校校長、產業翹楚及一線教師300 多人&#xff0c;共商人工智能時代計算機基礎…

AppTrace:重新定義免填邀請碼,解鎖用戶裂變新高度

??在移動互聯網時代&#xff0c;?用戶裂變是App增長的核心引擎&#xff0c;而邀請機制則是裂變的關鍵驅動力。然而&#xff0c;傳統的邀請碼機制——依賴用戶手動輸入、記憶復雜字符——已經成為用戶體驗的絆腳石&#xff0c;導致轉化率下降、運營成本上升。?AppTrace? 作…

神經網絡常見激活函數 13-Softplus函數

文章目錄Softplus函數導函數函數和導函數圖像優缺點PyTorch 中的 Softplus 函數TensorFlow 中的 Softplus 函數Softplus 函數導函數 Softplus函數 Softplus?(x)ln?(1ex)\begin{aligned} \operatorname{Softplus}(x) & \ln \bigl(1 e^{\,x}\bigr) \end{aligned} Softplu…

深度理解 KVM:Linux 內核系統學習的重要角度

&#x1f4d6; 推薦閱讀&#xff1a;《Yocto項目實戰教程:高效定制嵌入式Linux系統》 &#x1f3a5; 更多學習視頻請關注 B 站&#xff1a;嵌入式Jerry 深度理解 KVM&#xff1a;Linux 內核系統學習的重要角度 作者&#xff1a;嵌入式 Jerry 一、為什么開發者需要學習 KVM&…

閉包的定義和應用場景

一、閉包是什么&#xff1f; 閉包是指函數可以“記住”并訪問它定義時的詞法作用域&#xff0c;即使這個函數在其作用域鏈之外執行。 簡單說&#xff1a;函數 A 在函數 B 中被定義&#xff0c;并在函數 B 外部被調用&#xff0c;它依然能訪問函數 B 中的變量&#xff0c;這就是…

北京-4年功能測試2年空窗-報培訓班學測開-第五十四天

今天交付的成果是&#xff0c;初版簡歷雖然只寫了項目部分&#xff0c;但用了一整天&#xff0c;期間聯系了前司組長&#xff0c;拿到了性能測試報告。然后再看壓測腳本&#xff0c;突然能看懂了&#xff0c;對服務端日志也能看懂些了&#xff0c;還找到了客戶端日志怎么說呢&a…

算法訓練營day24 回溯算法③ 93.復原IP地址 、78.子集、 90.子集II

今天繼續回溯算法的專題&#xff0c;第三篇博客&#xff01; 93.復原IP地址 輸入&#xff1a;s "25525511135" 輸出&#xff1a;["255.255.11.135","255.255.111.35"] 切割字符串為4段&#xff0c;當進行到第四段的時候對第四段字符串進行判斷…

jeccg-boot框架實現xls模板導出功能

文章目錄一、后端部分二、前端部分三、模板制作一、后端部分 //1、在application-dev.yml文件增加模板路徑path :#模板路徑saxls: /data/opt/saxls/ //2、控制層寫法 public class sabassalController extends JeecgController<sabassalVo, IsabassalService> {Autowired…

LangChain4j入門:Java開發者的AI應用開發指南

&#x1f680; 在AI浪潮席卷全球的今天&#xff0c;Java開發者如何快速上手大語言模型應用開發&#xff1f;LangChain4j為我們提供了完美的解決方案&#xff01; 前言&#xff1a;為什么Java開發者需要LangChain4j&#xff1f; 想象一下&#xff0c;你正在開發一個企業級應用&…

相機光學(五十)——Depth AF

1.什么是Depth AFDepth AF&#xff08;景深自動對焦&#xff09;&#xff0c;也稱為 Depth-of-Field AF&#xff08;景深對焦&#xff09; 或 DEP AF&#xff0c;是一種基于景深范圍的自動對焦技術&#xff0c;核心目標是&#xff1a;確保從前景到背景的一整段距離都在清晰景深…

Unity 堆棧分析實戰指南 C#

Unity 堆棧分析實戰指南 提示&#xff1a;內容純個人編寫&#xff0c;歡迎評論點贊&#xff0c;來指正我。 文章目錄Unity 堆棧分析實戰指南1. 前言2. 什么是堆棧3. Unity 中的堆棧4. 堆棧分析工具5. 如何進行堆棧分析6. 實戰案例分析案例 1: 性能瓶頸分析案例 2: 內存泄漏檢測…

AE MDX L6 L12 L18 電源手側操作使用說明

AE MDX L6 L12 L18 電源手側操作使用說明

Gemini Function Calling 和 Qwen3 Embedding和ReRanker模型

Gemini API 的函數調用&#xff08;Function Calling&#xff09;功能。它解決了傳統大語言模型&#xff08;LLM&#xff09;的一個關鍵局限&#xff1a;LLM 本身是基于訓練數據的“知識庫”&#xff0c;擅長生成文本和回答問題&#xff0c;但無法直接執行代碼、訪問實時數據或…

??VMware Workstation Pro 17.5.0 安裝教程 - 詳細步驟圖解(附下載+激活)?

VMware Workstation Pro 17.5.0 是一款功能強大的虛擬機軟件&#xff0c;允許用戶在一臺計算機上同時運行多個操作系統&#xff08;如 Windows、Linux、macOS&#xff09;&#xff0c;適用于開發、測試、運維及學習環境搭建。本教程提供 ??詳細安裝步驟??&#xff0c;包括 …

端到端神經網絡視頻編解碼器介紹

一、技術演進&#xff1a;從模塊優化到全局智能的范式躍遷 傳統編解碼器的效率天花板&#xff08;1990-2017&#xff09; 架構局限&#xff1a;H.264/HEVC依賴手工設計的運動估計、DCT變換、熵編碼模塊&#xff0c;各模塊獨立優化導致全局效率損失。高分辨率瓶頸&#xff1a;4…

Kubernetes (k8s)環境重啟Pod方式總結

前言&#xff1a;在 Kubernetes (k8s) 中&#xff0c;沒有直接的命令如 kubectl restart pod 來重啟 Pod&#xff0c;因為 Pod 的生命周期由控制器&#xff08;如 Deployments、StatefulSets 或 ReplicaSets&#xff09;管理。重啟操作本質上是通過刪除并重建 Pod 來實現的&…

OOA、OOD 與 OOP:面向對象范式的核心支柱詳解

作為軟件系統架構的核心范式&#xff0c;面向對象方法貫穿軟件開發生命周期。OOA、OOD 和 OOP 分別代表分析、設計和實現三個關鍵階段&#xff0c;共同構成一個連貫的工程體系。一、OOA (Object-Oriented Analysis&#xff0c;面向對象分析) 目標&#xff1a;理解問題域&#x…

GBase 8a 與 Spring Boot + MyBatis 整合實戰:從環境搭建到CRUD操作

一、引言 在企業級數據管理場景中&#xff0c;GBase數據庫憑借其高性能的數據分析能力和對SQL標準的良好兼容性&#xff0c;成為金融、電信等行業的常用選擇。本文將詳細演示如何將GBase數據庫與Spring Boot、MyBatis框架整合&#xff0c;實現高效的數據持久化操作&#xff0c…

功能安全之BIST的基本原理

BIST&#xff08;Built-In Self-Test&#xff0c;內建自測試&#xff09;是一種將測試功能直接集成到集成電路&#xff08;IC&#xff09;或系統內部的設計方法。其基本原理的核心在于&#xff1a;讓被測試電路自身&#xff08;或借助少量專用硬件&#xff09;來生成測試激勵、…

Linux 程序地址空間

目錄 Ⅰ、什么是程序地址空間&#xff1f; Ⅱ、虛擬地址空間是什么樣的&#xff1f; 一、虛擬地址空間和頁表 1、什么是頁表&#xff1f; 2、什么是虛擬地址空間&#xff1f; 3、什么是vm_area_struct? Ⅲ、為什么要用虛擬地址空間&#xff1f; 一、進程的獨立性 二、…