S0DimSourceColumn.cs 2.2 KB

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