# 变更日志 (Changelog)

## v8.1.11 (2026-09-29)

### 新特性

- **`RegisterMemberHandler` 支持按类型注册**（`LiteOrm.Common`）：新增 `RegisterMemberHandler(Type type, string? memberName = null, handler)` 重载，`memberName` 传 null 时按类型登记成员兜底，显式指定成员的注册优先。

### 改进

- **`ExprString` 与 `RawSql` 移入 `LiteOrm.Common`**（`LiteOrm.Common`）：随表达式基础设施一并下移，命名空间不变，引用方无需改动。

### 修复

- **修正 MySQL 的 `CAST` 类型名**（`LiteOrm`）：`MySqlBuilder` 覆盖 `GetSqlTypeName`，整型渲染为 `SIGNED` / `UNSIGNED`、字符串与 Guid 渲染为 `CHAR`。OceanBase、TiDB、GreatDB 一并修正。

***

## v8.1.10 (2026-09-27)

### 破坏性变更

- **显式定义 `Computed` 时不再自动带 `Read`**（`LiteOrm.Common`）：只写 `Computed` 的计算列不进 `SELECT`，只用于查询条件。

### 新特性

- **计算列支持嵌套引用**（`LiteOrm.Common`）：`{属性名}` 占位符可指向同一实体上的其他计算列或关联列（`[ForeignColumn]`），渲染时递归展开为嵌套表达式，每层自带括号。

- **新增 `SqlTable.View` 属性**（`LiteOrm.Common`）：表定义与视图定义可互相反向获取。

### 改进

- **`SyncTable = Never` 的实体初始化时不再触碰**（`LiteOrm.DependencyInjection`）：不建表也不预加载表信息，其非法元数据配置不会再中断整批同步。

- **命令缓存改为逐语句判定**（`LiteOrm`）：`GetPreparedCommand(Async)` 新增 `useCache` 参数，`Insert` / `BatchInsert` 恢复复用缓存，原签名重载保留。

- **`GenericSqlExpr` 支持隐式转换为 `ValueTypeExpr`**（`LiteOrm.Common`）：`Expr.Sql(...)` 的结果可直接用于值位置，不必再手工调用 `AsValue()`。

***

## v8.1.9 (2026-09-22)

### 破坏性变更

- **`[Intercept]` 改用 Autofac 内置特性**（`LiteOrm.Common` / `LiteOrm.DependencyInjection`）：移除 LiteOrm 自带的 `InterceptAttribute`（原 `LiteOrm.Common/Attributes/InterceptAttribute.cs`），统一使用 `Autofac.Extras.DynamicProxy.InterceptAttribute`，引用该特性的代码需添加 `using Autofac.Extras.DynamicProxy;`；自动注册时会对声明该特性的实现类型调用 `EnableInterfaceInterceptors()`，特性声明的拦截器随之生效。

### 新特性

- **服务鉴权落地**（`LiteOrm.DependencyInjection` / `LiteOrm.Common`）：`[ServicePermission]` 声明的匿名与角色限制在 `ServiceInvokeInterceptor` 中生效，用户主体从注入的 `IUserContext.UserPrincipal` 获取（认证状态取 `Identity.IsAuthenticated`，角色匹配走 `IsInRole`；`LiteOrmOptions.RegisterUserContext` 支持泛型 / 实例 / 工厂注册），校验未通过抛新增的 `ServicePermissionException`。声明 `AllowAnonymous` 的方法与未注册 `IUserContext` 的场景直接放行，不校验角色。框架内置的 `IEntityViewService<T>` 声明为匿名放行，`IEntityService<T>` 声明为要求已认证，注册 `IUserContext` 后无主体的写入会被拒绝。

### 改进

- **简化异常的日志记录**（`LiteOrm` / `LiteOrm.DependencyInjection`）：启动同步表结构、开启事务、初始化连接池等位置不再先记日志再原样抛出，改为直接抛出，由调用方决定如何处理，同一异常不再重复记录。`LiteOrmCoreInitializer.SyncTables` 随之去掉包裹整段同步流程的 try/catch，只保留单表同步失败时的记录。

***

## v8.1.8 (2026-09-20)

### 破坏性变更

- **`DbCommandProxy` 改为按次创建的包装代理**（`LiteOrm`）：构造函数改为内部重载 `(DAOContext, DbCommand, bool ownsTarget)`，`Target` 改为私有，`IsReusable` 改为只读；`DAOContext.PreparedCommands` 改存 `DbCommand`，取用时新建不拥有缓存的代理，释放代理不再影响缓存。

- **`SqlBuildContext` 改为构造注入构建器**（`LiteOrm.Common` / `LiteOrm`）：`SqlBuilder` 成为必填的非空构造参数，无参构造与三参构造替换为 `SqlBuildContext(ISqlBuilder)` 与 `SqlBuildContext(ISqlBuilder, SqlTable?, string, string[]?)`；`ToSql` / `ToPreparedSql` / `RenderComputedExpression` / `BuildFunctionSql` 等不再接收 `ISqlBuilder` 与参数集合，改从上下文读取。

- **函数处理器与动态 SQL 委托签名简化**（`LiteOrm` / `LiteOrm.Common`）：`FunctionSqlHandler` 改为 `(ref ValueStringBuilder, FunctionExpr, SqlBuildContext)`，`SqlGenerateHandler` 改为 `(SqlBuildContext, object?)`；`RegisterFunctionSqlHandler(string, SimpleFunctionSqlHandler)` 更名为 `RegisterSimpleFunctionSqlHandler`。

- **`IExprStringBuildContext` 移除 `SqlBuilder` 属性**（`LiteOrm.Common`）：构建器统一从 `SqlBuildContext` 读取，`DAOBase` 的显式接口实现与 `ExprString` 的空值兜底分支一并移除。

### 改进

- **枚举常量改为内联字面量**（`LiteOrm.Common`）：`Expr.Const` 的枚举值按底层数值直接内联进 SQL（如 `"State" = 1`），不再走参数，切片不占参数位。

### 修复

- **DAO 主键读写路径补齐固定筛选条件**（`LiteOrm`）：`GetObject` / `ExistsKey` / `Update` / `Delete` / `DeleteByKeys` 与批量读写此前只按主键过滤，现改为带上 `Column.Constant` 收敛出的 `ConstFilter`，模型看不见的行读不出、改不动、删不掉；声明了固定筛选的表也不再复用命令缓存。

- **修复命令缓存装配后即被释放**（`LiteOrm`）：`GetOrAddPreparedCommand` 在 `finally` 里释放了刚装配好并准备交给缓存的命令，缓存里的一直是已释放的命令，复用时抛 `ObjectDisposedException`。现改为仅在装配异常时释放，未命中才写入缓存。

- **修复 `DAOContext.IsValid` 未判断上下文已释放**（`LiteOrm`）：连接池在归还上下文时若判定无效或池已满会释放它（连带释放缓存命令），而 `IsValid` 只在连接 `Broken` 时判无效，已释放的上下文仍被 `SessionManager` 复用。现增加已释放判断，释放过的上下文会被丢弃并重建。

***

## v8.1.7 (2026-09-14)

### 破坏性变更

- **`DataSourceConfig` / `ReadOnlyDataSourceConfig` 的 `Provider` / `SqlBuilder` 改为可赋值 `Type` 属性 `ProviderType` / `SqlBuilderType`**（`LiteOrm.Common`）。配置文件 JSON 键名不变，加载时立即解析为 `Type`，失败抛 `TypeLoadException`；代码中构造配置只能赋 `Type`，另提供 `DataSourceConfig(Type providerType, string? connectionString)` 构造。

### 新特性

- **新增 `LiteOrmContext`**（`LiteOrm`）：不依赖 DI 的链式上下文。`AddDataSource<TConnection>` 登记数据源，`CreateSession()` 返回会话，`new ObjectDAO<User>(session)` 即可读写。不注册服务、不读 `IConfiguration`。

### 改进

- **`EntityService` 的事件订阅者改为惰性解析**（`LiteOrm`）：构造时不再解析 `IEntityServiceEvent<T>`，首次触发事件通知时才向容器索取并缓存，此后复用同一份集合；订阅者构造异常随之延后到首次实体操作时暴露。

### 修复

- **修复 AOT 下框架内置泛型服务未注册**（`LiteOrm`）：泛型 DAO 与服务改为固定注册，`AutoRegisterServices` 只控制用户自定义服务与 DAO。

***

## v8.1.6 (2026-09-10)

### 破坏性变更

- **`DisableLiteOrmCodeGenAttribute` 重命名为 `LiteOrmCodeGenAttribute`**（`LiteOrm.Common`）：仅生成指定的内容，不再依赖 AOT 构建属性自动判定；未声明时仍由源生成器按 AOT 开启状态自动全量生成。使用旧特性名的程序集需改用 `[assembly: LiteOrmCodeGen(...)]`。

- **`DefaultServiceTypeResolver` 重命名为 `DefaultTypeResolver`**（`LiteOrm.Common`）：`ServiceNamespace`/`ModelNamespace` 合并为 `Namespaces` 命名空间列表，类型名解析时按列表顺序依次以 `命名空间.类型名` 匹配（泛型服务名与类型参数共用该列表）；未指定命名空间时回退全程序集短名扫描。使用旧类名或旧属性的代码需迁移。

### 改进

- **源生成器细粒度代码生成控制**：`LiteOrmCodeGenAttribute` 支持分别控制 `TableInfo` / `DataReaderMappers` / `PropertyAccessors` / `AotTypeRegistration` / `AutoRegister` 的生成，声明即按定义生成，未声明按 AOT 自动判定。
- **优化 Remote 服务端泛型服务类型解析**（`LiteOrm.Remote.Server`）：默认注册`IEntityService<T>`、`IEntityViewService<T>`、`IEntityServiceAsync<T>`、`IEntityViewServiceAsync<T>`泛型服务，自动检测名称后缀（如 `IEntityService` 泛型检测 `` `IEntityService`1 ``）。
- **`LiteOrm` 包不再内置源生成器**：分析器统一由 `LiteOrm.Common` 提供，避免工程同时引用两个包时同源分析器被加载两次、生成代码重复定义（`CS0101` / `CS0111`）。
- **AOT 类型注册改为独立生成管道**：`LiteOrmAotTypeRegistration` 的生成与实体元数据生成拆分，由独立的编译管道输出，每个编译单元恰好一份，不再因多条生成路径重复产出同名类型。
- **远程代理注册改为单例**（`LiteOrm.Remote`）：`IEntityService<T>` / `IEntityServiceAsync<T>` / `IEntityViewService<T>` / `IEntityViewServiceAsync<T>` 的代理实现由 `Scoped` 改为 `Singleton`。

### 修复

- **修复工厂重载未注册核心服务**：`AddLiteOrm(Func<IServiceProvider, LiteOrmOptions>)` / `RegisterLiteOrm(Func<IServiceProvider, LiteOrmOptions>)` / `AddLiteOrmRemote(Func<IServiceProvider, LiteOrmRemoteOptions>)` 此前只注册选项工厂便直接返回，遗漏核心服务注册，导致容器中缺少核心服务；现于注册工厂后继续完成核心注册。

- **修正 `GetObject` / `GetObjects` 等场景下列类型与实际值不一致的错误**：`ColumnDefinition.ToDbValue` 新增 `IDbConverter` 参数，键值、时间戳等裸值传入时，若与列级转换器的值类型不一致，改为按「(值类型, 列 `DbValueType`)」从转换器注册表解析写转换器再绑定，不再直接把原值传给驱动。

***

## v8.1.5 (2026-09-02)

### 破坏性变更

- **移除** **`LiteOrmRemoteOptions.TransportFactory`**（`LiteOrm.Remote` 客户端）：自定义传输层统一通过 `Transport` 实例或 `AddLiteOrmRemote` 工厂重载注册。

- **移除** **`AddLiteOrmRemote(string configSection, ...)`** **与** **`AddRemoteServer(string configSection, ...)`** **的配置节重载**（含内部 `BindFromConfiguration`）：不再通过 `configSection` 参数绑定配置节，改为通过注入工厂从 `IConfiguration` 读取参数。

- **`AddLiteOrmRemote`** **改为** **`IServiceCollection`** **扩展**：签名由 `IHostBuilder AddLiteOrmRemote(this IHostBuilder, ...)` 变更为 `IServiceCollection AddLiteOrmRemote(this IServiceCollection, ...)`，返回服务集合以支持链式注册；用法从 `Host.CreateDefaultBuilder(args).AddLiteOrmRemote(...)` 调整为 `Host.CreateApplicationBuilder(args).Services.AddLiteOrmRemote(...)`。

### 改进

- **核心库** **`AddLiteOrm`** **支持注入工厂**：新增工厂重载 `AddLiteOrm(Func<IServiceProvider, LiteOrmOptions>)`。

- **DI 版** **`RegisterLiteOrm`** **支持注入工厂**：新增工厂重载 `RegisterLiteOrm(Func<IServiceProvider, LiteOrmOptions>)`。

- **Remote 客户端注册支持注入工厂模式**：`AddLiteOrmRemote` 新增工厂重载 `AddLiteOrmRemote(Func<IServiceProvider, LiteOrmRemoteOptions>)`，工厂接收 `IServiceProvider`（可从 `IConfiguration` 等解析参数）。

- **Remote 服务端选项支持自行注册**：`AddRemoteServer` 未提供工厂重载，但 `RemoteServerOptions` 以 `TryAddSingleton` 注册，可先调用 `services.AddSingleton(sp => new RemoteServerOptions { ... })` 注册选项实例，`AddRemoteServer` 会跳过已注册的实例（工厂优先于 configure 回调）。

> **注**：工厂配置均以 **重载** 形式提供，即 `AddLiteOrm(Func<IServiceProvider, LiteOrmOptions>)` / `RegisterLiteOrm(Func<IServiceProvider, LiteOrmOptions>)` / `AddLiteOrmRemote(Func<IServiceProvider, LiteOrmRemoteOptions>)`，**不存在** `AddLiteOrmOptions()` 等独立方法。运行时以工厂构造的选项为准，覆盖 configure 回调设置的默认值。

***

## v8.1.4 (2026-08-24)

### 破坏性变更

- 复杂类型（数组/集合、自定义类）属性**不再自动生成列为表列**，须显式标注 `[Column]`（并按需指定 `DbType = Array`）；已知标量（数值、`string`/`char`、`byte[]`、`Guid`、日期、枚举）及 `Json`/`Jsonb` 映射类型仍自动映射。

- `EntityService<T>` / `EntityService<T, TView>` / `EntityViewService<T>` 构造函数改为接收 `IServiceProvider`，由容器解析所需的 `ObjectDAO<T>` / `ObjectViewDAO<T>`；派生服务构造函数同步调整，依赖注入场景无需改动。

- `ServiceInvokeInterceptor` 移除**全局静态事件** **`ExceptionHandling`**（及 `context.Handle(...)` 抑制/转结果机制），改为通过依赖注入订阅服务调用事件；异常在通知后仍原样抛出。

- `EntityService<T>` / `EntityService<T, TView>` 移除 `protected virtual` 的 `*Core` 系列方法（`InsertCore` / `UpdateCore` / `DeleteCore` / `DeleteIDCore` / `UpdateOrInsertCore` 及异步版本），逻辑内联到对应公开方法；重写这些方法的自定义服务需调整。

### 改进

- `ColumnAttribute` / `ForeignColumnAttribute` 均新增 `ConverterType` 用于声明列级转换器；`ForeignColumn` 读取外键投影列时**优先自身声明的转换器，否则回退目标列**。

- 数值类型互转现已默认注册（覆盖 `decimal`/`float`/`double` 与整型族互转，如 `Decimal→Int32`），跨数值类型读写无需手动注册。

- 值转换机制优化：转换统一收敛为「委托式转换器」，解析优先级固定为 列级转换器 → 按 (值类型, 数据库取值类型) 的注册表 → 直接赋值；`null`/`DBNull`/空字符串 等空值统一提前短路，未注册或无需转换时不再做通用兜底。

- 补全各数据库通用 SQL 函数的方言注册，C# 方法名经 `LambdaExprConverter` 转为 `FunctionExpr` 后不再因函数名不匹配或方言差异生成无效 SQL：

  | 函数                   | 基类 (SQLite/MySQL/SQLServer) | Oracle      | PostgreSQL | SQL Server     | <br /> | <br /> |
  | -------------------- | --------------------------- | ----------- | ---------- | -------------- | ------ | ------ |
  | `ToLower`            | `LOWER`                     | —           | —          | —              | <br /> | <br /> |
  | `ToUpper`            | `UPPER`                     | —           | —          | —              | <br /> | <br /> |
  | `Pow`                | `POWER`                     | —           | —          | —              | <br /> | <br /> |
  | `Char`               | `CHAR`                      | `CHR`       | `CHR`      | —              | <br /> | <br /> |
  | `Ceiling`            | `CEILING`                   | `CEIL`      | `CEIL`     | —              | <br /> | <br /> |
  | `Truncate`           | `TRUNCATE(x,0)`             | `TRUNC`     | `TRUNC`    | `ROUND(x,0,1)` | <br /> | <br /> |
  | `Concat`             | `CONCAT`                    | \`          | <br />     | \`             | —      | —      |
  | `Log`                | `LOG`                       | `LN`        | `LN`       | —              | <br /> | <br /> |
  | `Log10`              | `LOG10`                     | `LOG(10,x)` | `LOG`      | —              | <br /> | <br /> |
  | `Atan2`              | `ATAN2`                     | —           | —          | `ATN2`         | <br /> | <br /> |
  | `Max` (标量)           | `GREATEST`                  | —           | —          | —              | <br /> | <br /> |
  | `Min` (标量)           | `LEAST`                     | —           | —          | —              | <br /> | <br /> |
  | `Max`/`Min` (SQLite) | —                           | —           | —          | `max`/`min`    | <br /> | <br /> |

  - `Max`/`Min` 通过 `IsAggregate` 区分聚合（`MAX`/`MIN`）与标量（`GREATEST`/`LEAST`）；SQLite 的 `max`/`min` 同时支持标量与聚合。

  - `Abs`、`Round`、`Floor`、`Sqrt`、`Exp`、`Sin`/`Cos`/`Tan`/`Asin`/`Acos`/`Atan`、`Sign`、`Replace`、`Coalesce`、`Upper`/`Lower`（ExprExtensions 形式）等标准 SQL 同名函数无需注册，默认渲染即可跨数据库工作。

- `ISqlBuilder` 新增 `TryAppendSqlLiteral` 方法：字符串常量（`Expr.Const(string)`）渲染时，仅含常规字符（无反斜杠、控制字符）的字符串以 `'value'` 形式直接内联（单引号以 `''` 转义），含特殊字符的仍走参数化，兼顾安全与性能。计算列表达式中可使用 `Expr.Const(" ")` 等字符串常量。

- 新增 `System.Text.RegularExpressions.Regex` 方法的 Lambda 到 SQL 函数映射，支持静态形式 `Regex.M(...)`、实例形式 `new Regex(pattern).M(...)`、闭包变量形式 `regex.M(...)`（实例形式通过求值 Regex 对象反射读取 Pattern）：

  | C# 方法/成员                                     | SQL 函数             | 说明                                 |
  | -------------------------------------------- | ------------------ | ---------------------------------- |
  | `Regex.IsMatch(input, pattern)`              | `REGEXP_LIKE`      | 正则匹配谓词（WHERE）                      |
  | `Regex.Replace(input, pattern, replacement)` | `REGEXP_REPLACE`   | 正则替换                               |
  | `Regex.Match(input, pattern).Value`          | `REGEXP_SUBSTR`    | 提取首个匹配子串                           |
  | `Regex.Match(input, pattern).Index`          | `REGEXP_INSTR - 1` | 首个匹配位置（转为 0 基以匹配 C# `Match.Index`） |
  | `Regex.Match(input, pattern).Success`        | `REGEXP_LIKE`      | 是否匹配（谓词）                           |

  - 各方言注册：`REGEXP_LIKE` 在 MySQL 使用 `REGEXP` 运算符、PostgreSQL 使用 `~` 运算符；`REGEXP_REPLACE`/`REGEXP_INSTR`/`REGEXP_SUBSTR`/`REGEXP_COUNT` 默认渲染同名函数（Oracle/MySQL 8.0+/PostgreSQL 原生支持）。

  - `SqlBuilder.DefaultFunctionSqlHandler` 默认处理器按「函数名(参数列表)」渲染，`RegisterFunctionSqlHandler(functionName)` 仅含名称的重载直接复用默认渲染。

- Oracle 标识符不再强制转大写，与其他数据库行为一致。

- `EntityService` 新增基于观察者的实体事件接口 `IEntityServiceEvent<T>`（含便捷基类 `EntityServiceEventBase<T>`），在插入、更新、删除、`UpdateOrInsert`、`DeleteID`、`DeleteAll`、`UpdateAll` 等操作前后触发 `OnXxxing` / `OnXxxed` 回调，Before 返回 `false` 可取消操作；批量方法（`BatchInsert` / `BatchUpdate` / `BatchDelete`）逐条触发单条事件，支持逐条剔除。

- `System.Text.Json.Nodes.JsonNode` 类型属性现已内置支持：自动映射为 `DbValueType.Json` 列（JSON 字符串往返存取），并支持索引器 / `GetValue<T>()` 的 JSON 路径 Lambda 映射（`JsonExtract` / `JsonValue` 等 SQL 函数）。

- `ServiceInvokeInterceptor` 新增三个**注入式事件接口** `IServiceInvokingEvent` / `IServiceInvokedEvent` / `IServiceExceptionEvent`，分别于服务方法执行前、成功返回后、抛出异常后回调；`ServiceInvokeContext` 携带原始参数（不做掩码）、耗时与返回值。三者可独立实现、通过 DI 注册，且不影响调用流程。

### 修复

- 修正自定义查询 `SearchAs`/`SearchOneAs` 中，当自定义 `SelectItem` 的列名与结果属性名不一致且未显式指定别名时无法正确读取结果的问题（自动补充 `AS` 子句）。

- 修复部分调用点将实体对象整体当作裸值绑定到驱动导致的 `No mapping exists from object type ...` 错误。

- `SortProperty` 排除索引器属性，修复内置 `Item`（索引器）与自定义 `Item` 属性重名导致的循环依赖误判。

- `SearchAsAsync` / `SearchOneAsAsync` 对齐接口补充 `CancellationToken` 参数，修复 `EntityViewService<T>` / `RemoteViewServiceAsyncProxy<T>` 未实现接口成员的问题。

***

## v8.1.3 (2026-08-18)

### 破坏性变更

- 统一使用 `DbValueType` 替代 `DbType`，仅在数据库操作边界转换为 `System.Data.DbType`。合并 `DbTypeMap` 至 `DbValueTypeMap`。

- `IDbConverter.GetDbType(Type)` 改为 `GetDbValueType(Type)`；新增 `GetDefaultLength(DbValueType)`。

- `DbValueType.Array` 改为掩码（值 128），可与标量类型按位或组合（如 `DbValueType.Int32 | DbValueType.Array`）。

- `Expr.Cast` / `SqlBuilder.GetSqlTypeName` / `GetDefaultLength` 参数改为 `DbValueType`。

### 改进

- 计算列支持 `ValueTypeExpr` 形式表达式（`ColumnDefinition.ExpressionExpr`）。

- `DataReaderConverter` 在 `DbValueType.Default` 时通过当前 `SqlBuilder` 推断方言相关的读取器类型。

***

## v8.1.2 (2026-08-17)

### 优化 AOT 编译

- **修复 AutoRegisterGenerator 枚举/属性名错位**：生成器将 `AutoRegisterServiceTypes` 改为 `RegisterPolicy`，命名参数 `ServiceTypes` 改为 `Policy`。

- **移除全局裁剪告警抑制**（`SuppressTrimAnalysisWarnings`），添加 `DynamicallyAccessedMembers` 注解链与 `UnconditionalSuppressMessage`，使裁剪/AOT 告警在编译期可见。

### 新特性

- **计算列支持** **`ValueTypeExpr`** **形式表达式**：`ColumnDefinition.ExpressionExpr` 属性允许使用 `Expr.Prop("Price") * Expr.Prop("Quantity")` 等 Expr 树动态设置计算列表达式；渲染时通过 `ExprSqlConverter` 转为 SQL，仅允许不生成参数的固定 SQL（属性引用、常量、函数、算术运算），产生参数时抛 `NotSupportedException`。与字符串形式 `Expression` 同时设置时优先使用 Expr 树形式。

***

## v8.1.1 (2026-08-07)

### 破坏性变更

- `[AutoRegister]` 的 `ServiceTypes`（此前为 `Type[]`）已改为枚举 `RegisterPolicy`：`All`（默认，实现类型自身 + 接口）、`Self`（仅自身）、`Interface`（仅接口）。原 `[AutoRegister(Lifetime.Scoped, typeof(IFoo))]` 写法请改为 `[AutoRegister(RegisterPolicy.Interface, Lifetime = Lifetime.Scoped)]`。

- `DAOBase` 及派生 DAO（`ObjectDAO<T>`、`ObjectViewDAO<T>`、`DataDAO<T>`、`DataViewDAO<T>`）构造函数需传入 `SessionManager`，不再依赖静态 `SessionManager.Current`。手动构造 DAO 时请传入 `sessionManager`；依赖注入场景由容器自动解析。`SessionManager.Current` 仅保留为外部使用入口，`AddLiteOrm()` 会自动将其绑定到当前作用域实例。

- `ColumnAttribute.DbType` 与 `ColumnDefinition.DbType` 由 `DbValueType?` 改为非空 `DbValueType`，默认值为新增的 `DbValueType.Default`（表示未显式指定、运行时按属性类型推断）。原 `DbType == null` 判空逻辑改为 `DbType == DbValueType.Default`。

- `IDbConverter.ConvertToDbValue` 的参数由 `DbType` 改为 `DbValueType`（默认 `DbValueType.Object`），不再接受 `DbType` 参数。

- `Param.DbType` 类型由 `DbType?` 改为 `DbValueType`（默认 `DbValueType.Default`）。

- `DbValueType` 枚举新增 `Default = -1`、`Jsonb = 29`、`Array = 30`；集合类型属性未显式指定类型时自动推断为 `Array`（此前推断为 `Json`）。

### 新特性

- `RegisterLiteOrm()` 的 `LiteOrmOptions` 新增 `AutoRegisterServices` 选项（默认 `true`），设为 `false` 可跳过自动扫描注册 (`009d2c3`)

- `EntityService<T>`、`EntityViewService<T>`、`ObjectDAO<T>`、`ObjectViewDAO<T>`、`DataDAO<T>`、`DataViewDAO<T>` 基类新增 `[AutoRegister(RegisterPolicy.All, Lifetime = Lifetime.Scoped)]`，派生类自动继承注册行为。

- 数组类型支持：集合属性自动推断为 `DbValueType.Array`；PostgreSQL 生成原生数组列（`integer[]`、`text[]` 等），其余方言回退文本 JSON 存储。

- PostgreSQL 数组函数：新增 `array_to_string`、`array_append`、`ANY` 等函数的解析与 SQL 生成，`ANY` 支持数组作为单参数绑定。

- 新增 `LiteOrm.Pgsql` 命名空间，提供 `ValueTypeExpr` 的 PgSQL 专用扩展（`ArrayToString`、`ArrayAppend`、`Any`、`Contains`、`JsonbExtractPath`、`JsonbExtractPathText`、`JsonbContains`、`JsonbBuildObject`、`JsonbBuildArray`）。

- JSON/JSONB 类型：`DbValueType.Json`/`Jsonb` 支持，PostgreSQL 生成 `JSON`/`JSONB` 列，MySQL 生成 `JSON` 列。

- 新增 `JsonExprExtensions` 公共 JSON 函数扩展（`JsonExtract`、`JsonValue`、`JsonQuery`、`JsonContains`、`JsonObject`、`JsonArray`、`IsJson`），并为 MySQL / SQLite / SQL Server / Oracle / PostgreSQL 注册各自原生 JSON 函数。

- Service 新增 Lambda 方式的 `SearchAs` / `SearchOneAs` / `SearchAsAsync` / `SearchOneAsAsync` 扩展（`Expression<Func<IQueryable<T>, IQueryable<TResult>>>` 投影形式）。

- 实体支持计算列（非实际列）：`ColumnAttribute.Expression` + `ColumnMode.Computed`，不生成物理列、以表达式返回结果并生成查询条件。

### 改进

- 非 AOT 模式自动注册改用运行时程序集扫描（`LiteOrmAutoRegistration.Apply()`），不再生成源代码；AOT 模式仍由源生成器编译期生成，二者按 `RuntimeFeature.IsDynamicCodeSupported` 自动分流 (`009d2c3`)

- `AutoRegisterGenerator` 的 AOT 判定与 `TableInfoGenerator` 统一，读取 `build_property.enableaotanalyzer` / `enabletrimanalyzer` 等分析器属性 (`009d2c3`)

- Autofac 自动注册（`RegisterLiteOrm()`）中，实现类型或其接口带 `[Service]` 特性（`IsService = true`）时会自动应用 `ServiceInvokeInterceptor` 拦截，无需显式声明 `[Intercept]`。

- `RegisterLiteOrm()` 移除 `LiteOrmOptions.RegisterScope` 选项，作用域跟踪始终默认自动启用（`ScopeExtensions.RegisterScope` 仍保留为内部调用）。

- `ConvertFromDbValue` 支持数组/集合值到 `List<T>` 等目标集合的转换。

- 源生成器 `TableInfoGenerator` 适配非空 `DbValueType` 生成。

***

## v8.1.0 (2026-08-02)

### 破坏性变更

本版本引入多项破坏性变更，详细迁移指南见 [8.1 升级指南](./upgrade-guides/upgrade-guide-8.1.md)。

- `RegisterLiteOrm()` 从 `LiteOrm` 基础包移至 `LiteOrm.DependencyInjection` 包（新增），命名空间由 `LiteOrm` 改为 `LiteOrm.DependencyInjection`

- 自定义 `IBulkProvider` 不再使用任何特性标记，`BulkProviderFactory` 与 `BulkProviderAttribute` 已移除，改为直接设置 `SqlBuilder.BulkProvider` 属性 (`0f7fe25`)

### 新特性

- 基础库新增 `AddLiteOrm()`：纯 MS DI 注册（无 Autofac / AOP），自动应用 `[AutoRegister]` 源生成注册 (`f1b2ef1`, `464b044`, `afecea3`)

- 新增 AOT / NativeAOT 支持：`LiteOrm.Generators` 源生成器在编译期生成实体 / DAO / Service / 类型注册代码，`ExprJsonConverter`、`LambdaExprConverter`、`DAOContextPoolFactory`、`SqlBuilderFactory` 等改为 AOT 安全实现 (`90d75f1`, `1205f4f`, `1eb9dc0`, `0058f05`, `3ca894c`, `a5cfa31`)

- 新增 `LiteOrm.DependencyInjection` 包（原宿主集成项目更名），DI 能力从基础库拆分独立 (`b45aeeb`, `0322465`, `b0b4177`)

### 改进

- `PreparedSql` 移至 `LiteOrm.Common` 项目，参数类型由 `KeyValuePair` 改为自定义 `Param` (`f50c72e`)

- 目标依赖包版本降低，减少版本冲突 (`ad695e6`)

- 宿主集成 / Remote 使用单例 `ProxyGenerator` 优化性能 (`8f8753d`)

- `AttributeTableInfoProvider` 不再依赖 `SqlBuilderFactory`、`DataSourceProvider` (`b50b49a`)

- 优化建表加锁机制，避免发生死锁 (`148f2ac`)

- DAO、Service 增加 AOT 相关特性标注 (`36641fa`, `0599305`, `1737234`, `e68ded4`)

- `ColumnDefinition.DbType` 可为空，运行时自动判定 DbType 类型 (`09bd95d`)

***

## v8.0.20 (2026-07-28)

### 新特性

- ExprString 新增 `RawSql` 标记类型 (`6f401b6`)

- 增加 CTE 递归关键字支持 (`81fade6`)

- 新增表级 `SyncTable` 配置 (`038e93b`)

- 新增 `ShortId` 工具类（数字加小写字母）(`18d70be`)

- `DAOContext` 新增 `Id` 属性及连续异常失效机制 (`18d70be`, `4831a82`)

- 新增 Remote/Server 身份认证机制，支持 `ClientId/Secret` 认证模式及多会话身份隔离 (`285de8b`, `37e0d2b`, `47eb3f1`, `b2e354b`)

- `RemoteInvoke` 新增 `RequestID` 用于请求追踪 (`e092218`)

### 改进

- `DatabaseSync` 补列时为非空值类型列追加默认值 (`8fd9662`)

- `SessionManager` 重构生命周期管理，`Current` 改为从当前 scope 实时解析 (`0698464`, `ce2435b`)

- `LiteOrmCoreInitializer` 注入 `IComponentContext` 替代 `SessionManager`，消除 captive dependency

- `HttpRemoteServiceTransport` 禁用 `HttpClient.UseCookies`，改由 `ICredentialsResolver` 管理票据 (`b456ab2`, `d322c04`, `37e0d2b`)

### 修复

- 修复 `ParamCountLimit` 配置无效 bug，默认值调整为 1000 (`e4fa04b`)

***

## v8.0.19 (2026-07-06)

### 新特性

- 取消 `ExceptionHook` 机制，新增 `ExceptionHandling` 全局事件进行异常处理 (`f552b91`)

- 新增 `OnTableSyncing` 钩子，可按 `Type` 设定是否同步表 (`5f17866`)

- 自增列建表支持起始值和增量配置 (`a0a7d93`)

- 新增 `Expression<Func<T, T>>` 形式的 Update 方法 (`6060360`)

***

## v8.0.18 (2026-06-30)

### 新特性

- 新增国产数据库 SqlBuilder 支持 (`cd73fb7`)

- 新增 `JsonRemoteServiceTransport` 传输实现 (`d8cddca`)

- Remote/Server 统一支持 `AutoRegisterEntityServices`，默认为 `true` (`edc3ffb`)

### 改进

- Expr 的 `Delete`、`Update` 改为 `DeleteAll`、`UpdateAll`，避免重名冲突 (`f71d27b`)

### 修复

- 修复 Server 端方法匹配失败问题 (`60b8e20`)

- 修复 Remote.Server 匹配泛型服务名称 bug (`2ea5e2c`)

***

## v8.0.17 (2026-06-18)

### 新特性

- 新增 Remote 模块，支持远程代理模式 (`e01a660`)

- 新增 `CycleDetector` 检测 Expr 循环引用 (`02df339`)

- 新增三目运算符 (`a ? b : c`) 解析为 `CASE` 语句 (`eb0def4`)

### 重构

- 重构 `ExprVisitor` 和 `ExprValidator`，支持多种遍历和验证方式 (`0c0499c`)

### 修复

- 修复 Join 条件未指定优先级导致不能正确添加括号的 bug (`ebc87e6`)

- 修正默认 SqlBuilder 匹配方式，正确识别 PostgreSql 和 SqlServer (`e664272`)

***

## v8.0.16 (2026-05-27)

### 新特性

- 新增 `Expr.Reduce` 扩展 (`c206a6d`)

- 新增 `PropertyOrder` 属性排序功能 (`7f7dd7e`)

### 重构

- `FromExpr` 和 `TableJoinExpr` 重构，支持使用子查询作为源 (`8ec2c1d`)

### 修复

- 修复 Timestamp 列未生效 bug (`378759d`)

***

## v8.0.15 (2026-05-10)

### 新特性

- 增加 CTE 表达式支持 (`cc4f8c2`)

***

## v8.0.14 (2026-04-28)

### 新特性

- 新增 CodeGen 项目 (`c862ffd`)

- 新增 `StringExprConverter` 按实体类型的 `Parse`/`ParsePagedQuery` 方法 (`b4d422f`)

### 修复

- 修复 Insert 方法自增列非参数返回方式下的报错问题 (`073b4f7`)

***

## v8.0.13 (2026-04-10)

### 新特性

- 增加属性常量筛选机制 (`ad1148c`)

- `TableJoin` 支持指定外表主键 (`7cf1afc`)

- `ForeignType` 可声明多个 (`35f4e47`)

### 重构

- `LogicSet` 拆分为 `AndExpr` 和 `OrExpr` (`6dd1063`)

***

## v8.0.12 (2026-04-02)

### 新特性

- 新增 `ExprValidator` 验证机制 (`2c9245e`)

- 新增 `TableExpr` 和 `TableJoinExpr` 及其序列化 (`1ee64b3`, `5b2a116`)

- 新增窗口函数支持 (`b7245d1`)

- 新增 `ExistsRelated` 方法，实现自动关联 (`6aa5ff2`)

- 新增 SqlGen ExprString 解析及 `ExprInterpolatedStringHandler` (`6eac5d5`, `bf0f85d`)

- 新增 `DDLGenerator` 用于生成建表 SQL (`fc91353`)

- 新增预生成实体类 `DataReaderConverter` (`8ac1ca6`)

- 新增 Lambda 分表方式 (`b94ca29`)

- 新增 `ForeignExists` 方法 (`2a5960b`)

- 新增自定义方法处理器和 SQL 构造器 (`31be232`)

- 新增 `IdentityIncreasement` 配置 (`894cc61`)

- 新增列默认值支持 (`07b30b5`)

### 改进

- 数据读取优化效率，采用动态编译方法读取 (`207fbe2`)

- 优化会话管理机制，`SessionManager` 生命周期完全由容器 Scope 维护 (`c3b52fc`)

### 修复

- 修复 Sqlite 的 `Now`、`Today` 时区问题 (`8e6e0ed`)

- 修复子查询生成 SQL bug (`b25e120`)

***

## v8.0.10 / v8.0.11 (2026-03-11)

### 新特性

- 自定义 `SqlBuilder` 的注册和配置支持 (`60041c8`)

***

## v8.0.8 / v8.0.9 (2026-03-06)

### 新特性

- 完成 `ExprSqlConverter` 的 ToSql 实现 (`a41196e`)

- 为 `ObjectViewDAO` 实现 ExprString 功能 (`fd0f746`)

- 完善 Expr API 合法性校验与测试 (`5c5ba35`)

***

## v8.0.0 \~ v8.0.7 (2026-02-11)

### 新特性

- 初始版本，完善 Expr API 合法性校验与测试 (`5c5ba35`, `2948732`)

