【开源】跨语言·跨平台·跨数据库(3) —— 为用宝框架增加ORM,让AI执行 📅 2026/7/14 4:39:08 【开源】跨语言·跨平台·跨数据库(3) ——为用宝框架增加ORM让AI执行2026-07-13作者周方勇 / 咏方舟-长江支流金质打印通、用宝框架开源作者用宝框架 ·拥抱第一 · 一次书写 · 三端复用用宝框架是轻量级企业级分层架构基架也是开放的、可扩展的架构体系。.NET Standard 2.0零依赖支持 MySQL / SQL Server / Oracle / SQLite并可扩展。SQL就是最好的跨平台语言可跨语言无缝迁移至鸿蒙 ArkTS 及 Java 技术栈接口名、类名、方法签名三端完全一致。用宝架构开发的所有应用可直接移植到 Java/ArkTS无需重新设计架构、无需重新分层、无需重新抽象业务逻辑只需按目标语言语法做形式上的转换。本文侧重为用宝框架增加轻量级 ORM在不改变核心基架的前提下获得实体映射 自动 SQL 生成能力增删改查完全不用写代码。本篇将20年前无泛型、无依赖注入、无EF时的轻量级设计重新整理形成完整的设计文档与约束规范让AI按照规范自动执行生成代码。当然为了代码生成少些bug我提供了之前源码特别是CommandTextBuilder。人工不仅是设计师更是有与AI沟通的能力以及程序员协助调试Bug的能力AI作为执行者将更大幅提升效率。用宝架构 ORM 扩展设计总结跨语言版前言用宝框架的轻量与开放用宝框架首先是轻量级的——UserBaoTech.Foundation核心库仅依赖System.Text.Json零 ORM 绑定零重量级抽象保持最小依赖和最大可移植性。但用宝框架也是开放的——核心不预设任何具体实现所有组件通过接口可替换、可扩展。这种设计既保障了基座的稳定性也为上层功能的生长留出了空间。本篇的目的就是为用宝框架增加一个 ORM 扩展模块让开发者在不改变核心基架的前提下获得“实体映射 自动 SQL 生成 事件钩子”的便利能力。本篇的目的就是为用宝框架增加一个 ORM 扩展模块让开发者在不改变核心基架的前提下获得“实体映射 自动 SQL 生成 事件钩子”的便利能力。 AI 时代的编程思想人是设计师AI 是执行者以下设计不仅是给开发者阅读的编码依据也是给 AI 执行的指令集。设计越详细、规范越清晰、约束越明确AI 生成的代码质量就越高越不需要人工修改。你用宝框架定义好了“怎么写”接口、基类、命名规范、跨语言约束AI 只需要根据表结构填空生成“写什么”实体、仓储、服务、控制器。这就是 AI 时代程序员的核心竞争力——从“写代码的人”进化为“设计架构、定义规范、指挥 AI 执行的人”。同时这个扩展模块必须继承用宝框架的跨语言设计约束接口定义中不使用IListT、ListT、IDictionaryTKey, TValue等特定语言集合类型统一使用数组T[]表示集合因为数组在 C#、Java、ArkTS 中都是原生语法不需要额外引入命名空间或类库这一原则贯穿整个 ORM 模块的设计确保用宝框架的业务代码可以直接“拷过去用”而不是靠“翻译器”转换这就是用宝框架的“轻量·开放·跨语言”三位一体设计。这套轻量级 ORM 的设计早在 2007年就已在 CSDN 上公开分享当时用的是 2004 年写的源码至今约 20 年。相关文章https://blog.csdn.net/flygoldfish/article/details/1561689https://blog.csdn.net/flygoldfish/article/details/1561792https://blog.csdn.net/flygoldfish/article/details/1562043只是今天在用宝框架上我根据框架轻量化特点应用跨平台并通用于java、ArcTS通用语言重新设计。你如果将本篇投喂给AIAI也可以帮你完成代码书写但如果再把用宝技术轻量框架的设计一起发给AI那生成的ORM代码就更适合用宝框架。【开源】跨语言·跨平台·跨数据库(1) —— 用宝技术轻量框架 AI 开发指南【开源】跨语言·跨平台·跨数据库(2) —— 用宝轻量框架设计必读一、用宝架构现有核心已有无需改动命名空间UserBaoTech.Foundation核心抽象IEntityTKey实体基接口Id、CreatedAt、UpdatedAt、IsDeletedIRepositoryT泛型仓储接口CRUD 执行 SQLRepositoryBaseT仓储基类提供默认 CRUD 实现子类需实现表名、映射、插入/更新值IDataAccessExecutor数据访问执行器封装连接、事务、SQL 执行及方言适配参数前缀、分页、自增回读IUnitOfWork工作单元管理事务边界ServiceBaseTParam,TResult/KeyServiceBaseTResult业务服务基类模板方法模式MessageResultT统一返回格式QueryParametersBase查询参数基类基础设施接口ILogger、ICacheProvider、IConfigProvider可插拔设计原则轻量、零依赖仅System.Text.Json、跨语言可迁移、接口优先、基类提供默认实现。二、ORM 扩展目标在不改变现有核心基架的前提下增加一个可选的 ORM 模块提供实体映射通过特性标记或手写元数据将实体类与数据库表、字段、主键关联。自动 SQL 生成根据实体元数据自动生成INSERT/UPDATE/DELETE/SELECT语句无需手动写 SQL。实体存取接口提供类似旧IEntityAccess的增删改查操作并通过虚方法钩子而非事件委托提供扩展点方便业务定制。与现有框架无缝集成复用IDataAccessExecutor执行 SQL复用IUnitOfWork管理事务。三、新增命名空间与核心接口命名空间UserBaoTech.Foundation.ORM1. 可映射实体接口IMapEntityTKey继承自IEntityTKey增加表结构元数据获取方法publicinterfaceIMapEntityTKey:IEntityTKey{// 表名stringTableName{get;}// 主键列表支持复合主键string[]PrimaryKeys{get;}// 字段列表string[]GetFields();// 字段值列表与 GetFields() 顺序一致object[]GetFieldValues();// 主键值列表object[]GetPrimaryKeyValues();// 从数据源加载实体voidLoadFrom(IEntityDataSourcesource);}// 跨语言数据源接口// C# 端适配 IDataReader// Java 端适配 ResultSet// ArkTS 端适配 relationalStore.ResultSetpublicinterfaceIEntityDataSource{objectGetValue(stringfieldName);}元数据提供方式两种可选特性方式使用[Table]、[Column]、[Key]等特性标记实体类IMapEntity的实现通过反射读取。手写方式实体类直接实现IMapEntity接口在GetFields()等方法中返回字段列表兼容旧代码风格。例如// 特性方式基类[Table(Products)]publicclassProduct:AttributeMapEntityProduct{[Column(Id)][Key]publicstringId{get;set;}[Column(Name)]publicstringName{get;set;}}// 手写方式基类publicclassProduct:ManualMapEntityProduct{publicstringId{get;set;}publicstringName{get;set;}protectedoverridestring[]GetFieldsCore(){returnnewstring[]{Id,Name};}protectedoverrideobject[]GetFieldValuesCore(){returnnewobject[]{Id,Name};}}### 2. 实体存取接口 IMapEntityAccess定义对单个实体类型的增删改查操作publicinterfaceIMapEntityAccessTEntitywhereTEntity:class,IMapEntitystring{// 当前实体实例TEntityEntity{get;set;}// 增删改查intInsert();intUpdate();intDelete();boolFillByPK();// 根据主键填充当前实体}3. 基类MapEntityAccessBaseTEntity实现IMapEntityAccessTEntity提供默认行为通过构造函数注入IDataAccessExecutor复用框架底层及非特定语言的IEntityDataSource内部使用CommandTextBuilder见下文根据实体元数据自动生成 SQL执行 SQL 时自动处理参数顺序先字段值后主键值确保UPDATE语句正确注意每个操作前后不再使用 C# 的event/delegate机制改用虚方法钩子OnBeforeInsert、OnAfterInserted等确保 Java/ArkTS 端通过继承重写即可获得完全一致的扩展能力引用IUserBaoException实现跨语言异常隔离publicabstractclassMapEntityAccessBaseTEntity:IMapEntityAccessTEntitywhereTEntity:class,IMapEntitystring{// 构造函数注入 IEntityDataSource 和 IDataAccessExecutorprotectedMapEntityAccessBase(IEntityDataSourcedataSource,IDataAccessExecutorexecutor){}// 实现接口publicTEntityEntity{get;set;}publicintInsert(){}publicintUpdate(){}publicintDelete(){}publicboolFillByPK(){}// 钩子方法虚方法子类可重写// 返回 booltrue 继续执行false 取消当前操作protectedvirtualboolOnBeforeInsert(){returntrue;}protectedvirtualboolOnAfterInserted(){returntrue;}protectedvirtualboolOnBeforeUpdate(){returntrue;}protectedvirtualboolOnAfterUpdated(){returntrue;}protectedvirtualboolOnBeforeDelete(){returntrue;}protectedvirtualboolOnAfterDeleted(){returntrue;}protectedvirtualboolOnError(IUserBaoExceptionex){returnfalse;}// 内部 SQL 拼装器privatestaticclassCommandTextBuilder{// ...}}所有操作钩子统一行为返回 true 继续流程false 中断后续操作。这个改动将保留到后续的ORM扩展设计总结中。设计要点钩子方法采用标准块体写法{ return true; }三端可直接拷贝虚方法重载在 C#/Java/ArkTS 中写法基本一致是跨语言扩展点的最佳实践不使用 C# 的箭头表达式避免三端语法差异4. 内部类CommandTextBuilder仅供MapEntityAccessBase内部使用不对外公开。根据表名、字段列表、主键列表生成INSERT/UPDATE/DELETE/SELECT模板参数占位符统一用字段名不区分数据库最终由IDataAccessExecutor自动适配方言UPDATE语句自动排除主键字段主键不作为SET子句提供参数列表生成方法区分普通字段与主键字段保证顺序正确四、与现有架构的集成点数据执行MapEntityAccessBase内部持有IDataAccessExecutor通过它执行所有 SQL自动获得方言适配、连接管理、事务支持。事务管理开发者在使用IMapEntityAccess时外部用IUnitOfWork包围即可实现多实体事务与现有Repository方式一致。服务层MapEntityAccessBase可以作为服务层的基础也可以与现有ServiceBase协同使用例如在 Service 中调用IMapEntityAccess。五、扩展点设计虚方法钩子而非事件委托每个操作Insert/Update/Delete前后均提供虚方法钩子供子类重写五、扩展点设计虚方法钩子而非事件委托每个操作Insert/Update/Delete前后均提供虚方法钩子供子类重写所有钩子统一返回bool含义如下返回值含义true继续执行后续流程false中断后续操作各钩子触发时机与用途钩子方法触发时机返回false的效果OnBeforeInsert()执行 INSERT 前取消本次插入OnAfterInserted()INSERT 成功后阻止后续提交或后续处理OnBeforeUpdate()执行 UPDATE 前取消本次更新OnAfterUpdated()UPDATE 成功后阻止后续提交或后续处理OnBeforeDelete()执行 DELETE 前取消本次删除OnAfterDeleted()DELETE 成功后阻止后续提交或后续处理OnError(IUserBaoException)发生异常时阻止异常向外抛出已处理为什么用虚方法钩子而不是 C# 的 event/delegate方式C#JavaArkTS三端一致性event/delegate原生支持❌ 无直接对应❌ 无直接对应❌虚方法重载virtual原生支持原生支持✅ 写法基本一致event/delegate是 C# 特有语法Java 和 ArkTS 没有直接对应。使用虚方法钩子三端开发者都可以通过继承基类、重写方法来实现完全相同的扩展逻辑代码可以直接拷贝只需调整语法格式。为什么后置钩子也返回bool前置钩子返回false可以取消操作如参数校验不通过后置钩子返回false同样有意义——例如插入成功后检查返回结果发现异常需要阻止后续提交或者删除成功后触发某些业务逻辑失败需要中断后续流程。统一返回bool让所有扩展点都具备“继续/中断”的控制能力灵活性更高。业务方可以通过重写钩子实现操作前校验如权限检查、字段自动填充操作后日志记录、缓存刷新操作后条件判断决定是否继续提交取消操作通过返回false异常处理与恢复六、跨语言设计约束重要为保持用宝框架“一次书写三端复用”的核心能力ORM 模块必须遵守禁止使用应使用原因IListT/ListTT[]数组数组在 C#、Java、ArkTS 中都是原生语法IDictionaryTKey,TValue简单类型或数组跨语言边界尽量用简单类型LINQ 表达式直接代码逻辑LINQ 在 Java/ArkTS 中无直接对应动态类型dynamic强类型或objectJava/ArkTS 不支持动态event/delegate虚方法钩子event/delegate 是 C# 特有语法箭头表达式标准块体{ return ...; }避免三端语法差异所有接口定义、方法签名、属性类型必须使用跨语言原生类型。七、注意事项与边界此模块为可选扩展不影响现有UserBaoTech.Foundation核心基架。不兼容旧代码但借鉴旧设计思想虚方法钩子、参数顺序处理。主键类型默认stringGUID但IMapEntityTKey支持泛型主键类型。复合主键PrimaryKeys支持多个字段GetPrimaryKeyValues()返回对应顺序的值。SQL 生成所有 SQL 均使用参数化查询防止注入。所有集合返回类型使用T[]保持跨语言一致性。八、对新 AI 的生成指令基于以上设计请生成UserBaoTech.Foundation.ORM命名空间下的完整代码文件IMapEntity.cs接口定义所有集合类型用T[]IMapEntityAccess.cs接口定义MapEntityAccessBase.cs基类实现含CommandTextBuilder内部类所有集合类型用T[]无 event/delegate钩子用虚方法示例实体Product展示特性标记方式用于测试不强制生成时遵循用宝框架风格使用 .NET Standard 2.0无第三方依赖所有集合返回类型使用T[]保持跨语言一致性方法命名清晰注释完整不使用event/delegate扩展点用虚方法钩子不使用箭头表达式用标准块体写法内部CommandTextBuilder的参数占位符处理与DataAccessExecutor的方言适配兼容错误处理引用IUserBaoException不暴露 C# 特有的Exception类型反馈与交流欢迎在评论区留言或私信交流。如果你正在寻找一套不用 EF、不用 Dapper、可跨语言迁移的轻量级基架用宝框架或许是一个值得尝试的选择。用宝框架拥抱第一 · 一次书写 · 三端复用——不仅是用户的朋友而且是用户的宝贝