namespace Admin.NET.Plugin.AiDOP.DataPlatform.S0Dim; /// /// 源表的一列在 information_schema.COLUMNS 里的形态,供 /// 决定该列的 JSON 表达式。 /// /// 之所以既要 又要 : /// MySqlConnector 的 TreatTinyAsBoolean(默认开)只对**恰好** tinyint(1) 生效, /// 而 tinyint(1) unsigned zerofill 走整数路径 —— 两者 DATA_TYPE 同为 tinyint, /// 只有 COLUMN_TYPE 能区分。这条差异已在 aidopdev 上用既有 raw_data 实测证实 /// (IsActive→BOOLEAN,enable_bom_version→INTEGER)。 /// /// 🔴 必须是带无参构造的可写类,不能写成 positional record(2026-09-08 实测): /// SqlSugar 用 IDataReaderEntityBuilder.CreateBuilder 反射构造结果对象, /// 对只有主构造函数的 record 会抛 ArgumentNullException (Parameter 'con')。 /// 该异常被 S0DimSameDbStagingLoader 吞掉后静默回退逐行路径 —— /// 功能正确但性能优化全部失效,且日志里只有一行「判定异常」,极易被当成环境问题略过。 /// public sealed class S0DimSourceColumn { /// SqlSugar 反射映射所需的无参构造。 public S0DimSourceColumn() { } /// 便于单测直接构造。 public S0DimSourceColumn(string name, string dataType, string columnType, bool isNullable) { Name = name; DataType = dataType; ColumnType = columnType; IsNullable = isNullable; } /// 物理列名(原样大小写)。 public string Name { get; set; } = ""; /// information_schema.COLUMNS.DATA_TYPE,如 varchar / tinyint public string DataType { get; set; } = ""; /// information_schema.COLUMNS.COLUMN_TYPE,如 tinyint(1) unsigned zerofill public string ColumnType { get; set; } = ""; /// 是否可空。 public bool IsNullable { get; set; } }