Skip to content

SqlSugar

约 1060 字大约 4 分钟

NET组件

2023-11-30

.NET构造器

public static class SqlSugarSetup
{
    public static void AddSqlSugar(this IServiceCollection services, ILogger logger, IConfiguration configuration)
    {
        var dbConfig = configuration.GetConfig<DbConnectionConfig>("ConnectionConfig");
        SetDbConfig(dbConfig);
        SqlSugarScope sqlSugar = new SqlSugarScope(dbConfig,
        db =>
        {
            db.Ado.CommandTimeOut = dbConfig.CommandTimeOut;
            db.Aop.OnLogExecuting = (sql, pars) => //执行前
            {
                //Debug.WriteLine("【" + DateTime.Now + "——执行SQL】\r\n" + UtilMethods.GetSqlString(dbConfig.DbType, sql, pars) + "\r\n");
                //logger.Information("{DbType}  " + UtilMethods.GetSqlString(dbConfig.DbType, sql, pars).Replace("\r\n", ""), "[SQL]");
            };
            db.Aop.OnLogExecuted = (sql, pars) => //后
            {
                logger.Information("{DbType}  {ExecutionTime}ms  " + UtilMethods.GetSqlString(dbConfig.DbType, sql, pars).Replace("\r\n", ""), "[SQL]", db.Ado.SqlExecutionTime.TotalMilliseconds);
                //Debug.WriteLine($"执行时间:{db.Ado.SqlExecutionTime.ToString()}");
            };
            db.Aop.OnError = ex =>
            {
                if (ex.Parametres == null) return;
                var pars = db.Utilities.SerializeObject(((SugarParameter[])ex.Parametres).ToDictionary(it => it.ParameterName, it => it.Value));
                //Debug.WriteLine("【" + DateTime.Now + "——错误SQL】\r\n" + UtilMethods.GetSqlString(dbConfig.DbType, ex.Sql, (SugarParameter[])ex.Parametres) + "\r\n");
                logger.Error(UtilMethods.GetSqlString(dbConfig.DbType, ex.Sql, (SugarParameter[])ex.Parametres));
            };
            //数据审计,自动填充
            db.Aop.DataExecuting = (oldValue, entityInfo) =>
            {
                if (entityInfo.OperationType == DataFilterType.InsertByObject)
                {
                    if (entityInfo.PropertyName == "CreateTime")
                        entityInfo.SetValue(DateTime.Now);
                }
                if (entityInfo.OperationType == DataFilterType.UpdateByObject)
                {
                    if (entityInfo.PropertyName == "UpdateTime")
                        entityInfo.SetValue(DateTime.Now);
                }
            };
            //db.Aop.OnExecutingChangeSql = (oldValue, entityInfo) => { }; //可修改sql与参数

            //全局实体过滤器,逻辑删除的数据不查询
            db.QueryFilter.AddTableFilter<IDeletedFilter>(u => u.IsDelete == false);
        });
        services.AddSingleton<ISqlSugarClient>(sqlSugar);
        services.AddScoped(typeof(SqlSugarRepository<>)); // 仓储

        InitDatabase(sqlSugar, dbConfig);
    }

    /// <summary>
    /// 初始化数据库与表
    /// </summary>
    /// <param name="sqlSugar"></param>
    /// <param name="config"></param>
    private static void InitDatabase(SqlSugarScope sqlSugar, DbConnectionConfig config)
    {
        // Sqlite不支持删除列和修改列只能添加列
        if (!config.EnableInitDb) return;

        // 创建数据库
        if (config.DbType != SqlSugar.DbType.Oracle)
            sqlSugar.DbMaintenance.CreateDatabase();

        //[SugarTable]
        var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false)).ToList();
        if (!entityTypes.Any()) return;
        foreach (var entityType in entityTypes)
        {
            var splitTable = entityType.GetCustomAttribute<SplitTableAttribute>();
            if (splitTable == null)
                sqlSugar.CodeFirst.InitTables(entityType);
            else
                sqlSugar.CodeFirst.SplitTables().InitTables(entityType);
        }
    }

    /// <summary>
    /// 配置连接属性
    /// </summary>
    /// <param name="config"></param>
    private static void SetDbConfig(ConnectionConfig config)
    {
        var configureExternalServices = new ConfigureExternalServices
        {
            EntityNameService = (type, entity) => // 处理表
            {
                entity.IsDisabledDelete = true; // 禁止删除非 sqlsugar 创建的列

                if (!type.GetCustomAttributes<SugarTable>().Any())// 只处理贴了特性[SugarTable]表
                    return;
                if (!entity.DbTableName.Contains('_'))
                    entity.DbTableName = UtilMethods.ToUnderLine(entity.DbTableName); // 驼峰转下划线
            },
            EntityService = (type, column) => // 处理列
            {
                if (!type.GetCustomAttributes<SugarColumn>().Any()) // 只处理贴了特性[SugarColumn]列
                    return;
                if (new NullabilityInfoContext().Create(type).WriteState is NullabilityState.Nullable)
                    column.IsNullable = true;
                if (!column.IsIgnore && !column.DbColumnName.Contains('_'))
                    column.DbColumnName = UtilMethods.ToUnderLine(column.DbColumnName); // 驼峰转下划线
            },
            //DataInfoCacheService = new SqlSugarCache(),
        };
        config.ConfigureExternalServices = configureExternalServices;
        config.InitKeyType = InitKeyType.Attribute;
        config.IsAutoCloseConnection = true;
        config.MoreSettings = new ConnMoreSettings
        {
            IsAutoRemoveDataCache = true,
            //IsAutoDeleteQueryFilter = true, // 启用删除查询过滤器
            //IsAutoUpdateQueryFilter = true, // 启用更新查询过滤器
            SqlServerCodeFirstNvarchar = true // 采用Nvarchar
        };
    }
}

建表特性:

名称描述
IsIdentity是否创建自增标识
IsPrimaryKey是否创建主键标识
ColumnName创建数据库字段的名称(默认取实体类属性名称)
ColumnDataType类型自动生成相应的数据库类型类型自动生成相应的数据库类型类型自动生成相应的数据库类型类型自动生成相应的数据库类型动生成相应的数据库类型 用法3:    多库兼容可以用 :看标题9
IsIgnoreORM不处理该列
ColumnDescription备注 表注释 (新版本支持XML文件)
Length长度 设成10会生成  xxx类型(10), 没括号的不设置
IsNullable是否可以为null默为false
DecimalDigits精度 如 decimal(18,2) length=18,DecimalDigits=2
OracleSequenceName设置Oracle序列,设置后该列等同于自增列
OldColumnName修改列名用,这样不会新增或者删除列
IndexGroupNameList已弃用 ,新用法看文档4.3
UniqueGroupNameList已弃用, 新用法看文档4.3
注意:有2个属性用处不同DefaultValue IsOnlyIgnoreInsertDefaultValue=默认值 用来建表设置字段默认值IsOnlyIgnoreInsert=true 插入数据时取默认值很多情况需要2个一起使用如果只建表不插入数据用1个 如果建表并且插入数据用2个

所有API:

GetDataBaseList获取所有数据库名称List
GetViewInfoList查询所有视图List
GetTableInfoList获取所有表,查询所有的表 (GetTableInfoList(是否缓存))List
GetColumnInfosByTableName获取列根据表名,获取字段,字段信息GetColumnInfosByTableName(表名,是否缓存)List
GetIsIdentities获取自增列List
GetPrimaries获取主键List
IsAnyTable表是否存在,判断表存不存在 ( IsAny(表名,是否缓存))bool
IsAnyColumn列是否存在bool
IsPrimaryKey主键是否存在bool
IsIdentity自增是否存在bool
IsAnyConstraint约束是否存在bool
DropTable删除表bool
TruncateTable清空表bool
CreateTable看标题 1.1,1.2,1.3bool
AddColumn添加列bool
UpdateColumn更新列bool
AddPrimaryKey添加主键bool
DropConstraint删除约束bool
BackupDataBase备份库bool
DropColumn删除列bool
RenameColumn重命名列bool
AddDefaultValue添加默认值bool
AddTableRemark添加表描述,表注释bool
AddColumnRemark添加列描述,表注释bool
DeleteColumnRemark删除列描述,表注释bool
RenameTable重命名表bool
CreateIndex创建索引,唯一约束(唯一索引)bool
IsAnyIndex索引是否存在bool
GetIndexList获取所有索引
GetProcList获取所有存储过程