Skip to content

Latest commit

 

History

History
313 lines (241 loc) · 22.2 KB

ChangeLog.md

File metadata and controls

313 lines (241 loc) · 22.2 KB

NewLife.XCode 更新日志

v12.3.2026.1024 (2026-10-24)

SonnetDB 数据库支持

  • 官方 ADO.NET 驱动适配:新增 XCode.SonnetDB(net10.0)依赖包,支持关系表元数据、常用 CRUD、自增、分页、批量 Insert/InsertIgnore/Upsert、单主键有界删除及基本迁移
  • 能力边界明确:对未完成的 Decimal/时间精度、长度、注释、Replace、复合主键删除和隔离等级明确保护或记录;能力与 SonnetDB issue/发布依赖见 Doc/SonnetDB.md,不宣称完整等价支持
  • 安全与迁移修复:数值条件按列类型转换并拒绝非法文本;Upsert 将唯一索引列解析为物理列名;默认值与索引迁移按物理表名处理,嵌入模式剥离 sonnetdb:// 前缀

31 种语言本地化

  • 运行时消息全覆盖:实体、DAL、会员、配置、服务层、数据库驱动与 XCodeTool 命令行提示统一改为可本地化模板,补齐 31 种语言词表
  • 实体元数据与设置页:实体元数据纳入 31 种语言词表,设置页字段支持多语言,实体元数据保持项目母语
  • 日志语言独立:修复日志误用界面语言的问题,日志语言与界面语言分离,并新增日志语言独立性断言
  • 质量门禁:新增词表完整性、英文占位、元数据键覆盖与源码消息覆盖测试及 CI 门禁

NativeAOT 与多平台

  • AOT 兼容:net8.0/net10.0 启用 IsAotCompatible,实体核心链路、LINQ、驱动加载器与 SQLite/NovaDb 场景通过 NativeAOT 实测;新增 AotSmoke 16 场景冒烟
  • 驱动加载降级:驱动加载器新增程序集限定名静态引用降级与 GetCallingAssembly 防护,适配 NativeAOT 裁剪
  • 泛型属性拷贝:新增 DataConversion.CopyProperty<TSource,TTarget>,AOT/裁剪下自动保留属性
  • 多平台 CI:单元测试扩展至 win-x64/linux-x64/linux-arm64/linux-la64 四 RID,新增 Android/iOS 移动端与 riscv64/s390x 指令集冒烟

数据访问与缓存

  • 实体缓存并发修复:刷新期间并发 Add/Remove/Update 不再被旧快照覆盖,刷新日志改为结构化变更记录,并补充确定性竞态测试
  • SqlServer 批量超时:批量操作继承命令超时,修复大批量写入沿用驱动默认 30 秒超时
  • 自动建库:修复 PostgreSQL/SqlServer 数据库不存在时无法自动建库
  • 属性更新安全:修复按属性更新时值中的 And/or 被误当作 SQL 片段或替换成逗号,避免 base64/JSON 数据被静默改写
  • 驱动兼容:修复无 DataAdapter 驱动下的数据集查询与 SQLite 备份兼容;MySQL 参数支持 Boolean 数组自动转换为 Int16 数组

实体与代码生成

  • 树形实体:修复自定义文本键不生效、FindAllParents 在 includeSelf=true 时不返回自身、Up() 第二位节点无法上升等缺陷
  • ETL 抽取器:修复时间分片空分片不推进导致的死循环、主键抽取重复最后一行、末页提前退出等缺陷
  • 魔方控制器:枚举列改用类型别名引用并自动去重,搜索参数补全 Decimal 与窄整型映射,统一实体类与控制器两侧搜索列名单
  • 代码生成:修复枚举命名空间生成、global:: 短名不可编译、Single 类型不匹配等缺陷

测试与工程

  • 依赖升级:NewLife.Core / IP / Remoting / Redis / Stardust / NovaDb / MySql / UnitTest 全部升级到最新正式版
  • 测试稳定性:分表测试连接名按数据库隔离,PostgreSQL 分表用例可重复运行;EntityCache 异步清理断言兼容 1~2 次刷新;SqlServer 连接超时放宽到 30 秒
  • Samples:Android 冒烟改为 JIT 并加固启动等待、崩溃检测与干净安装;Test 控制台支持无头单次运行
  • 测试覆盖:新增导航属性、树形实体、ETL 抽取器、自动迁移、多结果集、保存模式等测试;本地全量 1188 项(1088 通过、100 跳过、0 失败,PostgreSQL 与 LocalDB 就绪)
  • CI:发布工作流同时推送 GitHub Packages、NuGet.org 并创建 GitHub Release;新增四 RID、移动端与指令集兼容矩阵
  • 文档:11 种语言 README 全文翻译,生态版图与团队介绍对齐 NewLife.Core;新增 SonnetDB、AOT 兼容性与多语言本地化文档

Bug 修复

  • [fix] 实体表达式批量删除:生成参数后未传给执行接口,改用数据库方言生成可执行条件
  • [fix] GetOrAdd 空键:恢复空业务主键返回空而非空引用异常,三个重载与接口语义保持一致
  • [fix] NovaDb 分页:分页语法适配 LIMIT n OFFSET m
  • [fix] 空富文本备注:用户/部门保存时自动清理 <p><br></p> 一类无内容 HTML

v12.2.2026.0901 (2026-09-01)

数据权限(DataScope)增强

  • 拒绝越权写入:DataScopeModule.OnValid 校验失败时返回 false 拒绝操作(原实现仅记录审计日志后放行),避免越权新增/修改/删除
  • 缓存键含部门编号:数据权限缓存键由 DataScope:{userId}:{scope} 改为 DataScope:{userId}:{deptId}:{scope},用户调岗(DepartmentID 变化)后立即使用新部门列表;失效清理兼容新旧键,并说明缓存失效为尽力而为
  • 纯部门实体过滤修正:部门表"一行一个部门",仅本人范围退化为"当前用户所在部门"(ID == 当前用户.DepartmentID),避免恒假条件导致空表;新增 BuildDepartmentScopeFilter
  • 纯用户实体过滤修正:日志等无部门列表,非全部权限始终按当前用户过滤,避免 join 用户表放大成同事数据
  • 菜单/角色 DataScope 默认值修正:DataScope 列默认 -1(使用角色默认),仅在新增且未显式设置时按角色类型填充,避免显式 0(全部)被覆盖
  • 内置实体挂载:用户/部门/日志/菜单等内置实体挂载 DataScopeInterceptor;日志实现 IUserScope+IDataScopeFieldProvider,部门实现 IDepartmentScope+IDataScopeFieldProvider

多租户

  • 查询自动附加租户过滤:TenantInterceptor.OnQuery 查询时自动合并租户条件,业务代码无需手动调用 ApplyTenant
  • 业务类自动实现 ITenantScope:EntityBuilder 为含 TenantId 列的业务类自动追加 ITenantScope 接口,便于租户拦截器生效

Bug 修复

  • EntityDeferredQueue 自动分表:未指定会话时逐个 Save() 以支持自动分表,修复 Flush 异常
  • NovaDb Truncate 静默处理:表不存在时返回 0 而非报错,对齐 SQLite 驱动语义
  • XCodeTool BuildMap:映射表无显示字段时不再生成孤立 [Map] 特性;修复 ss[2] 越界风险;$ 表示 ToString() 替代显示字段

依赖与测试

  • 依赖升级:NewLife.Core 升级至稳定版 11.19.2026.901(原 beta 版);SQLite 原生库与测试依赖同步升级
  • 测试补充:新增租户 OnQuery/ApplyTenant 场景、DataScope 行权、NovaDb 嵌入模式等单元测试;本地(非外部数据库依赖)测试 861 项全部通过

v12.1.2026.0802 (2026-08-02)

导航属性与流式查询

  • 导航属性框架:新增导航注册(NavigationRegistry)、HasOne/HasMany Fluent API 配置、Include 路径构建与批量加载(BatchLoadNavigations/BatchLoadHasOne/BatchLoadHasMany);SelectBuilder 支持导航关系 JOIN 构建,实体操作接口提供导航基础支持
  • DAL.Select<T>() 流式 LINQ 查询:DAL 新增 Select<T>() 工厂方法,返回 IQueryable<T> 并自动绑定当前连接,支持 WhereIf/Where/OrderBy/Skip/Take/Page/Count/FirstOrDefault/ToList 全链式流式调用
  • LinqExtensions.Page 扩展:新增 Page(page, size) 分页扩展方法
  • [fix] 流式查询 take==0 误判:修复 EntityQueryProvider.Execute() 中 take==0 误判导致查询全量返回空的 bug

数据库元数据重构

  • DbMetaData 标准化:重构数据库元数据(DbMetaData)及其实现,标准化 DDL 操作方法接口(CreateDatabase/DropDatabase/CreateTable/DropTable),替代原有 SetSchema 多用途方法,各数据库类型同步实现,提升类型安全性、可读性与扩展性
  • DatabaseExist 统一:统一各库 DatabaseExist 实现,空值时从连接字符串解析数据库名并使用 GetSchema 查询;子类判断数据库存在不再走基类
  • 创建数据库完善:创建数据库增加数据库名判断,完善 CreateDatabaseSQL
  • [fix] 字段类型日志:修正字段类型日志输出,改用 TrimPrefix 方法
  • [fix] SQL 拼接逗号:修正 SQL 拼接时多余逗号的问题

连接池与并发优化

  • ConnectionPool 重构:重构连接池实现,支持异步借出归还、泛型 Execute,异常处理更完善,补全单元测试覆盖边界场景,升级 NewLife.Core 依赖
  • [fix] FieldCache 并发竞态:FieldCache<T>.FindAllName() 中 _task 非原子赋值导致并发首次访问启动多个 Task.Run(GetAll) 重复查询与写盘,且 _task.Result 阻塞调用存在死锁风险。改为锁内二次检查单飞行同步执行,移除 Task 体系
  • [fix] 异步重试阻塞线程池:DbSession.ProcessAsync 两个重载的重试循环由 Thread.Sleep 改为 await Task.Delay,避免异步路径阻塞线程池线程(同步 Process 保持不动)
  • [fix] HttpClient 泄漏:地区.Biz.FetchAndSave/Import 中 new HttpClient() 未释放,重复调用存在 socket 耗尽风险,补充 using 释放

新数据库支持

  • Hana/IRIS/VastBase/Network/NovaDb:新增 SAP HANA、InterSystems IRIS、VastBase、Network 网络虚拟数据库、NovaDb 自研数据库支持列表

代码清理

  • 清理废弃代码:移除已废弃接口(IMenu/IRole/IUser)、ETL 引擎、数据同步框架、Web 行为模块等冗余代码,精简代码库

Bug 修复

  • [fix] InfluxDB 批量写入:规范 InfluxDB 批量写入与能力声明

测试与文档

  • 测试隔离性与并发健壮性:消除共享 Membership.db 与全局 DAL.LocalFilter 导致的并行测试干扰,相关测试统一加入 [Collection("Database")] 串行集合;新增 FieldCache/ProcessAsync 并发回归测试;修复 ShardTestSQLite2 并行干扰;并行全量失败由 30 降至 28,剩余全为外部数据库依赖
  • 注释补全:补全审计发现的 6 处空 XML 注释标签;DbSession.GetSchema 移除误导性"缓存10分钟"注释,明确不缓存以保元数据实时性
  • 文档编排:按前置依赖原则重新编排功能模块、需求文档及架构设计文档;新增架构设计文档,更新需求文档与竞品分析报告

v12.0.2026.0702 (2026-07-02)

LINQ 查询体系

  • IQueryable<T> LINQ 查询:实体 Query 属性返回 EntityQueryable<T>,支持 Where/OrderBy/Skip/Take/Count/First/Single/ToList 等标准 LINQ 操作。EntityQueryProvider + LinqExpressionVisitor 将表达式树翻译为 XCode WhereExpression
  • WhereIf 内联条件:LinqExtensions.WhereIf(condition, predicate) 扩展方法,条件不满足时自动忽略;FindAllWhereIf(params (bool, Expression)[]) 实体级动态筛选
  • Include 预加载:Include(Type) 预加载关联实体整表缓存(EntityCache),与内存联表策略互补

新数据库支持

  • ClickHouse:列式分析型数据库 Provider,支持 ClickHouse.Client 驱动,HTTP 端口 8123
  • DuckDB:嵌入式 OLAP 数据库 Provider,支持 DuckDB.NET.Data 驱动,兼容 PostgreSQL 方言
  • MongoDB:文档型 NoSQL 数据库 Provider,支持 MongoDB.Driver 驱动

窗口函数

  • SelectBuilder.Window:新增 Window 属性,支持在 SELECT 列中注入窗口函数
  • WindowFunction 助手类:RowNumber()/Rank()/DenseRank()/Aggregate() 静态方法,生成标准 SQL 窗口函数语法

二级缓存(分布式)

  • CacheInvalidator:基于分布式 ICache 的版本号机制跨进程协调实体缓存失效
  • EntityCache/SingleCache 集成:Clear 操作自动递增分布式版本号,CheckCache 定时比对远程版本号

测试与文档

  • 测试扩充:Linq 42 用例(含 Parse 精确断言)、窗口函数 14 用例、二级缓存 6 用例、新 Provider 测试
  • 文档重写:需求文档、功能模块清单、竞品分析报告全面更新至 2026-07-02 版本
  • 类重命名:Linq 类名去掉 XCode 前缀(EntityQueryable/EntityQueryProvider/LinqExtensions)

v11.27.2026.0601 (2026-06-01)

模型与反向工程

  • 表级反向工程模式:支持在模型中为表级配置 Migration 策略,BindTableAttribute 与 EntityBuilder 已联动支持,便于按实体粒度控制建模行为

查询与 SQL 体验

  • FieldExtension.Between 增强:扩展区间查询表达能力,覆盖更多边界场景并补齐单元测试,提升条件构造可读性与正确性
  • SQL 预览能力增强:支持 DbCommand.ToString() 直接输出可读 SQL,降低排障与调试成本

批量写入与稳定性优化

  • 批量 SQL 生成优化:统一并优化批量 Update/Upsert SQL 生成流程,修复 UPSERT 逗号拼接问题,提升跨库执行稳定性
  • 批量累加字段升级:批量累加支持快照差值与降级覆写,增强复杂业务场景适配能力
  • 批量操作健壮性增强:批量实体操作统一过滤空元素,避免无效数据干扰批处理链路
  • 链路追踪改进:优化批量更新与缓存清理埋点,增强诊断可观测性

Bug 修复

  • [fix] MySql 参数数组兼容:支持 Boolean 数组参数自动转换为 Int16 数组,修复特定驱动参数绑定异常

测试与依赖

  • 测试覆盖完善:新增并完善 FieldExtension.Between 等单元测试,提升回归保障
  • 依赖更新:升级基础组件并同步核心依赖版本

v11.26.2026.0501 (2026-05-01)

功能增强

  • Model 模型规范升级至 202604 版本:新增多款数据库支持,增加 ItemType 等字段类型枚举,Membership 相关表新增 html/markdown 字段类型
  • 批量保存重构:统一 BatchSave 方法的验证流程与批量能力判断逻辑,提升跨库批量操作的行为一致性
  • 批量 Update 主键参与 Where 构建:批量 Update 操作现强制主键参与构建 Where 子句,避免因缺少主键条件导致全表更新风险
  • AddQueue 链路追踪埋点:为 AddQueue 操作增加 Tracer 埋点,提升异步队列写入的可观测性

Bug 修复

  • [fix] 达梦 BatchInsert 时间字段丢失:修复达梦数据库批量插入时 DateTime 字段值丢失问题
  • [fix] GetFieldType Nullable<T> 类型映射:修复 GetFieldType 方法对 Nullable<T> 类型未拆箱导致映射失败的问题,使用 Nullable.GetUnderlyingType 正确处理可空值类型
  • [fix] KingBase GetTableNames 列名错误:修复 KingBaseMetaData.GetTableNames() 使用错误的列名 Name 而非 TableName 导致获取表清单失败的问题
  • [fix] 默认租户编码:将默认租户的 Code 从空值修正为 Default,避免多租户判断逻辑异常

依赖更新

  • 升级依赖包并优化 NovaDb 相关实现

v11.25.2026.0403 (2026-04-03)

新功能

  • 远程数据库服务重构:重构远程数据库服务链路,增强鉴权机制并补齐集成测试覆盖
  • 批量能力体系升级:引入 BatchCapability 枚举,重构批量操作能力模型,提升跨库批量行为表达力
  • 租户拦截器增强:新增并完善 TenantInterceptor,强化多租户场景下的数据隔离控制
  • 建库字符集支持:创建数据库时支持为 SqlServer、Oracle、PostgreSQL 指定默认字符集

重要修复

  • SqlServer 空表赋值异常修复:修复 SqlServer 在表无数据时 SetValue 报错问题
  • SqlServer 字段映射修复:修复 varchar(-1) 映射为 varchar(max),并补充 TimeSpan 类型映射支持
  • KingBase 查询列引用修复:修复 KingBase SELECT 列名双引号处理问题,避免特殊列名查询异常
  • 脏数据字段匹配修复:EntityInterceptor.SetNoDirtyItem() 支持按 Name/ColumnName(忽略大小写)匹配字段

性能与稳定性优化

  • SQLite 截断策略优化:SQLiteSession.Truncate 改为 Drop+重建路径,提升大数据场景清理稳定性
  • 数据库适配信息优化:优化多数据库适配包与主库描述信息,提升驱动适配一致性

测试与文档

  • 测试覆盖增强:新增并增强 XCode 核心模块单元测试,补充 SQLite 全路径测试与远程服务相关测试
  • 文档体系完善:新增 XCode 核心能力与最佳实践文档,完善协作规范与数据层开发约定文档
  • 构建指令打包修正:修正 NewLife.XCode.targets 命名与项目引用,确保 Copilot 指令文件打包链路稳定

依赖更新

  • 多次升级 NuGet 依赖包
  • 更新 NewLife.Core 至 11.13.2026.323-beta0701

破坏性变更

无


v11.25.2026.0227 (2026-02-27)

新功能

  • NovaDb 数据库支持:新增对 NewLife 自研 NovaDb 数据库的适配,扩展国产自主数据库生态
  • InfluxDB 2.x 时序数据库适配:新增 InfluxDB 数据库适配器与驱动基础设施,支持时序数据 CRUD 及单元测试覆盖
  • TDengine 改用 HTTP 驱动:将 TDengine 驱动从原生驱动切换为 HTTP 协议,提升跨平台兼容性,更新默认端口与文档
  • TableItem 启动时全局配置:支持在应用启动阶段全局永久修改实体的表名(TableName)和连接名(ConnName),适用于表前缀、分库、单租户等场景;属性变更同时自动同步到 DataTable,无需手动调用
  • Meta.Session 自动同步:完善 Entity<TEntity>.Meta.Session 逻辑,自动检测并同步 ConnName / TableName 变化,确保 Session 始终指向最新连接和表名
  • CreateTable() 方法公开:将 internal static IDataTable CreateTable() 改为 public,方便外部直接构造实体元数据

重大变更(破坏性)

  • 移除模型表(外部 XML 映射)功能:彻底移除通过外部 xml 文件动态映射实体表结构的支持,包括 TableItem 合并逻辑、DAL.ModelTables 属性、XCodeSetting.ModelPath 配置项及相关单元测试;实体表结构现仅以代码特性为准
  • 移除 SQLite WAL 自动恢复与手动操作代码:简化 OpenConnection 逻辑,删除 WAL 恢复和 _checkpoint_ 手动干预,依赖 SQLite 自身自动处理,避免多进程场景下的干预风险

性能与代码优化

  • 缓存清理精确化:ClearCache 改用 func.Method 标识具体方法,避免因委托实例不同导致缓存未被正确清理
  • MySQL 驱动替换:以 NewLife.MySql 替换 MySql.Data,统一 MySqlSslMode 类型兼容性处理

文档与工具

  • XCode 数据模型与结构同步文档:新增完整的数据模型体系、正反向工程、类型映射、分表分库原理及与主流 ORM 对比说明
  • TableItem 启动配置文档:新增详细说明启动配置与动态修改的区别、典型用法及注意事项
  • InfluxDB 支持说明文档:新增 InfluxDB 接入与使用说明

依赖更新

  • 升级 NewLife.Core、NewLife.MySql 等依赖包至最新版本

v11.24.2026.0102 (2026-01-02)

新功能

  • 数据权限体系:引入多维度数据访问控制,支持多租户数据隔离与安全性
    • 支持租户级、部门级、用户级等多维度数据权限
    • 完善数据权限上下文及菜单级权限支持
    • 重构数据权限过滤逻辑与QueryAction枚举
    • 新增数据权限文档与单元测试覆盖
    • 完善租户相关单元测试
    • 只能操作本租户数据,提升数据隔离
  • 实体拦截器重构:统一实体模块为拦截器机制,提升扩展性
    • EntityBuilder支持XCode模块名称自动升级
    • 增强拦截器注释与结构,提升健壮性
    • 重构实体拦截器字段为EntityModules类型
    • 重构模块命名为拦截器并自动升级旧代码
  • 模型文件版本管理:支持模型文件版本号与自动升级机制
    • 检测旧版本文件并自动升级
    • 增强Version属性赋值处理
    • 支持ChineseFileName自动升级
  • 会员功能扩展:
    • Member表新增类型、数据范围等核心字段
    • 扩展Value字段长度至500
    • Department新增FindByCode查询方法
    • 会员核心表字段补全与类型规范,增强查询能力
  • 配置增强:
    • 优化DAL配置提供者绑定,支持ServiceProvider注入
    • 参数配置支持长文本,优化存储与读取逻辑
  • 地区数据更新:从PluginServer下载民政部最新地区数据
  • 菜单数据范围:使用枚举管理菜单数据范围

重要修复

  • [fix] 修复数据库注释特殊字符导致的SQL错误
  • [fix] 修复DateTime默认值SQL生成未加引号的问题,避免被误解析为数学表达式
  • [fix] 修复数据库驱动加载失败时的处理,失败时删除后重新下载
  • [fix] 修复批量插入实体列表时顺序不一致的问题(Valid内生成雪花Id需确保插入顺序)

性能优化

  • 引入AsArray,借助数组优化多线程修改集合问题

代码质量改进

  • 空引用安全:
    • 支持可空引用类型,提升空值安全性和健壮性
    • DDL方法可空化,接口兼容性提升
    • 提升空引用安全与健壮性,优化类型与判空处理
    • 支持可空引用类型与集合初始化现代化
  • 数据库兼容性:
    • 增强MySQL SslMode兼容性,支持新版驱动枚举
    • 优化CI测试环境及数据库单元测试兼容性
    • 恢复SQLite文件时增加埋点
  • 链路追踪:增强数据库检查链路追踪与日志记录

文档与工具

  • 协作指令:重构XCode协作指令文档并新增使用手册
  • 指令文件部署:重构部署方式,移除props,新增targets
  • CI/CD:删除中间临时文件,优化发布流程
  • XCodeTool:注释掉ChineseFileName选项赋值

依赖更新

  • 多次Upgrade Nuget包到最新版本

破坏性变更

无


v11.23.2026.0102 (2026-01-02)

修正延迟队列更新的BUG;优化大量对象缓存的并发查询;梳理重构Merge逻辑