开云盘口
开云的登录网址 疾驰bp框架-ORM设想时间陈述

疾驰 bp框架ORM 设想 — 时间陈述
文档版块:2026-06
章节编号:1.1
依据代码:CCFlow/Components/BP.En30(中枢 ORM 组件)
走漏:本文基于源码静态分析撰写,用于时间共享与有规划论证,竭力准确描摹设想念念想并客不雅分析优劣。
一、启事与设想规划
1.1 肇始于 2002 年
疾驰 ORM 设想肇始于 2002 年,启事是探索可复用的企业期骗框架时间。那时需要一套大致:
长入描摹「数据表 ↔ 实体类」的映射关系;
在多种数据库(SQL Server、Oracle、MySQL 等)上复用吞并套业务代码;
撑捏快速搭建料理类期骗(增点窜查、列表查询、主从表裁剪)。
EntityDBAccess.cs文献头谨防仍保留着创建时间美艳:
/*简介:庄重存取数据的类创建时间:2002-10终末修改时间:2002-10*/
1.2 设想规划(与市面 ORM 的相反点)
疾驰 ORM 从一驱动就不是「纯数据探望层」,而是面向企业低代码期骗的元数据框架:
维度
疾驰 ORM 规划
典型 ORM(EF Core / Hibernate)规划
中枢对象
表 + 字段 + 控件 + 关系
类 + 属性 + 导航属性
元数据载体
开云的世界杯中国登录网址Map/Attr/Attrs(代码 + 库表双轨)特点标注 / Fluent API / 商定
产出物
CRUD + 表单 UI + 查询面板 + 主从/多对多
CRUD + LINQ 查询
运行面貌
属性值存于 Row(Hashtable),弱类型读写强类型属性 + 变更追踪
这一取向决定了后续 CCFlow、JFlow、低代码表单、组织结构等模块均可在吞并套元数据上叠加能力,而无用交流界说字段语义。
二、演进历程:XML → Map / Attr / Attrs
2.1 第一阶段:XML 描摹映射(约 2002)
早期版块用 XML 文献抒发数据表与实体类的好意思满关系。Map.GenerMap(string xml)方法于今仍保留这一能力:读取 XML 中的Base、Attr、SearchAttr、Dtl、Dot2Dot等节点,动态构建Map对象。
#region 生成属性凭证xml. private string PKs = ""; public void GenerMap(string xml) { DataSet ds = new DataSet(""); ds.ReadXml(xml); foreach (DataTable dt in ds.Tables) { switch (dt.TableName) { case "Base": this.DealDT_Base(dt); break; case "Attr": this.DealDT_Attr(dt); break; case "SearchAttr": this.DealDT_SearchAttr(dt); break; case "Dtl": this.DealDT_SearchAttr(dt); break; case "Dot2Dot": this.DealDT_Dot2Dot(dt); break; default: throw new Exception("XML 建设信息空幻,莫得商定的美艳:" + dt.TableName); } } // 搜检建设的好意思满性。 }
XML 有规划的优点是映射与代码解耦、便于用具生成;污点是调试困难、版块料理老本高、贫瘠编译期搜检。
2.2 第二阶段:Map / Attr / Attrs 类(约 2003)
2003 年,架构阅兵为以Map、Attr、Attrs三个中枢类在 C# 代码中描摹映射,成为于今沿用的主旅途。
类
使命
Map描摹一个实体(En)的好意思满元数据:物理表名、主键计策、字段策划、从表、多对多、查询条目、联系方法等
Attr描摹单个字段/属性:键名、物理列名、数据类型、字段逻辑类型、UI 控件、可见性、默许值、外键绑定等
AttrsAttr的策划,提供AddTBString、AddTBInt、AddDDLEntities、AddDDLSysEnum等工场方法,简化Map构建实体子类通过重写 EnMap属性复返我方的Map界说。以组织结构中的Emp(用户)为例:
public override Map EnMap { get { if (this._enMap != null) return this._enMap; Map map = new Map("Port_Emp", "用户"); #region 基本属性 map.EnDBUrl = new DBUrl(DBUrlType.AppCenterDSN); map.IndexField = EmpAttr.FK_Dept; #endregion #region 字段 map.AddTBStringPK(EmpAttr.No, null, "编号", true, false, 1, 50, 30); // ... map.AddTBString(EmpAttr.Name, null, "称呼", true, false, 0, 200, 30); map.AddDDLEntities(EmpAttr.FK_Dept, null, "部门", new BP.Port.Depts, false); // ... #endregion 字段
代码化 Map带来了编译期类型安全(字段常量类如EmpAttr)、IDE 跳转、与业务逻辑同仓版块料理等上风,XML 旅途退居兼容与用具导入用途。
三、中枢架构
3.1 类端倪与使命

目次结构(BP.En30):
目次/文献
走漏
En/ 实体基类、 Map/Attr/Attrs、SqlBuilder、QueryObject、EntityDBAccess DA/ 数据库探望、 DBAccess、DataType、缓存 Sys/ 低代码表单位数据: MapAttr、MapData、MapDtl、SFTable、SFDBSrc Port/ 组织结构实体( Emp、Dept、Station等),均基于本 ORM 界说3.2 数据承载:Row 弱类型模子
实体字段值不径直映射为 C# 自动属性,而是存放在 Row(接纳Hashtable) 中,通过GetValByKey/SetValByKey读写:
public class Row : Hashtable { // ... public void LoadAttrs(Attrs attrs) { this.Clear; foreach (Attr attr in attrs) { switch (attr.MyDataType) { case DataType.AppInt: // ...
设想意图:
低代码场景下字段可运行时增删,无需重新编译实体类;
主表、从表、过程表单共用吞并套读写 API;
业务类仍可封装强类型属性(如 Emp.Name),里面转调GetValStringByKey。
3.3 捏久化活水线

组件
使命
SqlBuilder 凭证 Map/Attrs生成 SELECT/INSERT/UPDATE/DELETE,处理多主键、多数据库方言 SQLCache缓存实体级 SQL 模板,减少交流拼接
EntityDBAccess 实行 SQL、相等时触发 CheckPhysicsTable自动建表/扩列 QueryObject 链式构造 WHERE/ORDER BY,供 Entities批量查询3.4 主键计策
通过实体基类商定主键字段名:
基类
主键
典型场景
EntityNoNameNo(字符串)
部门、用户、脚色、过程编号
EntityOIDOID(自增整型)
运行实例、从标明细
EntityMyPKMyPK(组合字符串)
DeptEmp、DeptEmpStation等联系表FieldType摆设进一步分手字段逻辑脚色:鄙俚、主键、外键、摆设、主键+外键、联系文本、臆造字段等。
四、卓越字段映射:BP 彭胀能力
原始 ORM 仅科罚「数据库列 ↔ 实体属性」映射;疾驰 BP 层在此基础上彭胀为期骗元数据框架。
4.1 字段逻辑类型(FieldType / FieldTypeS)
public enum FieldTypeS { Normal = 0, // 鄙俚属性字段 Enum = 1, // 摆设字段 FK = 2 // 外键字段 } public enum FieldType { Normal, PK, FK, Enum, PKFK, PKEnum, RefText, NormalVirtual, MultiValues }
类型
含义
典型 API
属性字段鄙俚列,文本框/数值/日历
AddTBString、AddTBInt、AddTBDate 摆设字段 绑定 Sys_Enum或字符串摆设AddDDLSysEnum 外键字段 绑定另一 Entities策划AddDDLEntities 外部数据源字段 绑定 SFTable(SQL/WS/Handler 等)UIBindKey→SFTable 联系文本 外键旁的冗余走漏列(如 FK_Dept+FK_DeptT) 自动追加 key + "T"的AttrAttr.ToMapAttr与MapAttr.HisAttr组成代码 Map ↔ 库表 MapAttr双向革新桥梁,使设想态(设想器保存到Sys_MapAttr)与运行态(GenerMap动态生成Map)保捏一致。
4.2 控件类型映射(UIContralType)
Attr不仅纪录MyDataType(存储类型),还纪录UIContralType(呈现控件):
基础: TB(文本框)、DDL(下拉)、CheckBok、RadioBtn
过程/公文: HandWriting(签名)、FrmImgAth(图片附件)、GovDocFile(正文)、JobSchedule(程度图)
移动端: MapPin、MobilePhoto、Location
低代码表单设想器将控件建设写入 Sys_MapAttr,运行时MapDtl.GenerMap遍历MapAttrs调用map.AddAttr(mapAttr.HisAttr)合成好意思满Map,从而一份元数据同期驱动捏久化与 UI 渲染。
4.3 主表—从表映射(EnDtl)
Map.AddDtl声明主实体下的从表策划:
public void AddDtl(Entities ens, string refKey, string groupName = null, DtlEditerModel model = DtlEditerModel.DtlBatch, string icon = null) { EnDtl dtl = new EnDtl; dtl.Ens = ens; dtl.RefKey = refKey; dtl.GroupName = this.currGroupMethodName; dtl.DtlEditerModel = model; dtl.Icon = icon; this.Dtls.Add(dtl); }
refKey:从表中外键列(如FK_Node);
DtlEditerModel
:批量裁剪、查询裁剪、自界说 URL 等步地;
过程表单明细( MapDtl)、组织结构子面板均基于此机制。
4.4 一双多 / 多对多映射(AttrOfOneVSM)
Map.AttrsOfOneVSM描摹「一」端实体与「多」端实体通过中间表(MM 表)的联系,举例用户调遣所属部门:
map.AttrsOfOneVSM.AddBranches(new DeptEmps, new BP.Port.Depts, BP.Port.DeptEmpAttr.FK_Emp, BP.Port.DeptEmpAttr.FK_Dept, "部门调遣", EmpAttr.Name, EmpAttr.No, "@WebUser.DeptNo");
支捏树形部门、平铺面板等多种调遣 UI(Dot2DotModel),径直生成部门-东谈主员调遣界面,无需手写联系 CRUD。
4.5 外部数据源(SFTable / SFDBSrc)
SFTable
:界说下拉/列表的外部数据着手(本库 SQL、跨库、WebService、Java 处理器等);
SFDBSrc:多数据源连结建设,开云的世界杯中国登录网址使Map可指定DBSrc指向非腹地库;
字段通过 UIBindKey联系SFTable,兑现不建物理外键列也能绑定外部数据的下拉选项。
4.6 自动 DDL(CheckPhysicsTable)
实体在 Insert/Update失败时可触发CheckPhysicsTable:按Map.Attrs界说自动创建表或彭胀列长。这使低代码「先画表单、后建表」成为可能,亦然与「移动剧本驱动」的 ORM 的显赫相反。
4.7 查询与权限彭胀
Map还承载:
SearchNormals/SearchFKEnums:列表页查询条目;
HisRefMethods
:实体联系功能(修改密码、部门脚色调遣等);
UAC
:插入/删除/更新/稽查权限;
AddHidden:数据鸿沟过滤(如 SAAS 步地OrgNo = @WebUser.OrgNo)。
五、生态承载:基于 ORM 构建的产物模块
疾驰 ORM 不是孑然的数据层,而是 CCFlow / JFlow / 疾驰 BPM 低代码平台的长入元数据底座。

模块
与 ORM 的关系
疾驰 BPM / CCFlow 过程模板、节点、表单均用 Entity/Entities界说;运行期表单数据通过GEEntity(通用实体)+ 动态GenerMap读写 JFlow Java 版移植吞并套 Map/Attr语义,保捏跨说话元数据一致 低代码 设想器操作 Sys_MapData/Sys_MapAttr;运行时合成Map;主从表、外键、摆设、外部数据源均落在Attr彭胀属性上 组织结构Port_*五表实体均在BP.Port用EnMap声明;DeptEmp、DeptEmpStation用EntityMyPK;东谈主员界面用AttrsOfOneVSM调遣多部门 权限 / 报表 / 接口 长入 GetValByKey读写;QueryObject构造列表;ToJsonObject输出 API论断:更换 ORM 意味提防写元数据模子、表单设想器、过程引擎数据层、组织结构集成接口——老本极高,因此该 ORM 是平台级基础步伐而非可插拔组件。
六、与市面 ORM 的对比评估
6.1 对比总表
维度
疾驰 ORM(BP.En30)
Entity Framework Core
Hibernate / JPA
Dapper
定位元数据 + ORM + UI 描摹
标准 .NET ORM
Java 标准 ORM
微 ORM / SQL 映射
映射界说Map/Attr代码 +Sys_MapAttr库表特点 / Fluent API
注解 / XML
手写 SQL
查询面貌QueryObject+SqlBuilderLINQ
HQL / Criteria / JPQL
原始 SQL
变更追踪无(显式 Update)
有
有(Session)
无
UI 元数据内置(控件、布局、从表)
无
无
无
主从 / 多对多EnDtl/AttrOfOneVSM一等公民导航属性建设
联系映射
自行兑现
自动建表CheckPhysicsTableMigrations
hbm2ddl无
多数据库SqlBuilder方言分支
提供商插件
方言
取决于 SQL
低代码友好极高
低
低
低
强类型诞生体验中(Row + 部分封装属性)
高
高
高
学习弧线(纯 CRUD)中(需贯通 Map 体系)
中
中高
低
6.2 疾驰 ORM 的上风
元数据一体:吞并Attr描摹列类型、控件、外键、摆设、默许值,设想器与运行引擎零阻抗。
企业功能内建
:主从表、多对多调遣、列表查询、权限位、联系方法,减少交流管事。
低代码原生:运行期可GenerMap,字段可来自数据库建设,安妥用户自界说表单。
久经坐蓐考证
:2002 年于今,与 CCFlow 过程场景深度耦合(附件、签名、公文、轨迹等控件类型)。
多数据库与国产库:EntityDBAccess内可见 Oracle、MySQL、PostgreSQL、达梦、东谈主大金仓等分支。
6.3 疾驰 ORM 的局限
作歹式 ORM
:无法径直用于鄙俚 .NET 名意见「引包即用」,与 EF Core 生态(LINQ、移动、用具链)不兼容。
弱类型 Row
:大型团队纯代码确随即,穷乏编译期字段搜检,重构依赖全局搜索。
无当代查询概述:莫得 LINQ / IQueryable,复杂查询依赖SqlBuilder字符串,可读性与组合性弱于 EF。
无变更追踪:更新需显式调用Update并指定字段,易遗漏或误更新。
XML 遗产:GenerMap(xml)与代码EnMap双旅途并存,加多调遣心智职守。
测试与 Mock:Entity与DBAccess静态耦合细腻,单位测试需依赖数据库或大王人封装。
6.4 适用场景判断
场景
刻薄
疾驰 BPM / CCFlow / JFlow 二次诞生
必须使用本 ORM,无替代
低代码表单 + 过程 + 组织结构一体部署
最安妥全新 .NET 业务系统、与 BPM 无关
不推选,应选 EF Core + 零丁 DTO
仅需高性能只读查询
可在 Entities层旁路DBAccess.RunSQL,但失去元数据收益与外部 ORM 共存
仅刻薄畛域明晰的数据同步,幸免吞并表双映射
七、典型诞生步地示例
7.1 声明式实体(代码优先)
// 1. 字段常量类public class XxxAttr { public const string Title = "Title"; }// 2. 实体类public class Xxx : EntityNoName{ public override Map EnMap { get { if (_enMap != null) return _enMap; Map map = new Map("My_Xxx", "示例"); map.AddTBStringPK(XxxAttr.No, null, "编号", true, false, 1, 50, 20); map.AddTBString(XxxAttr.Title, null, "标题", true, false, 0, 200, 30); map.AddDDLSysEnum("Status", 0, "情状", true, false, "XxxStatus"); _enMap = map; return _enMap; } }}// 3. 策划类public class Xxxs : EntitiesNoName{ public override Entity GetNewEntity => new Xxx;}
7.2 运行时使用
Xxx en = new Xxx;en.No = "001";en.SetValByKey(XxxAttr.Title, "测试");en.Insert;Xxxs ens = new Xxxs;ens.RetrieveByAttr("Status", 1);Xxx en2 = new Xxx("001");en2.RetrieveFromDBSources;string title = en2.GetValStringByKey(XxxAttr.Title);
7.3 低代码动态表单(元数据优先)
设想器保存字段 → Sys_MapAttr;
MapDtl.GenerMap/MapData.GenerMap合成Map;
GEDtl/GEEntity手脚通用实体承载数据;
前端凭证 MapAttrJSON 渲染控件。
八、转头
疾驰 ORM 是一段从 2002 年 XML 映射演进到 2003 年Map/Attr/Attrs代码化元数据、并在二十余年中捏续彭胀为低代码期骗框架底座的时间阶梯。
它的实质不是「对象—关系映射库」,而是:
用长入的 Map元数据,同期描摹数据库结构、实体行为、UI 控件、主从与多对多关系、外部数据源与查询条目,并驱动 CCFlow、JFlow、组织结构与低代码表单的全人命周期。
与 Entity Framework、Hibernate 等市面 ORM 比拟,疾驰 ORM 在标准性、强类型、当代查询上不占优,但在低代码、过程、表单、组织一体化场景具有不行替代的语义内聚上风。贯通这一畛域,是正确使用和彭胀疾驰 BPM 平台的前提。
附录:中枢类型索引
类型
旅途
走漏
MapEn/MapExt/Map.cs实体元数据根对象
Attr/AttrsEn/MapExt/Attr.cs字段元数据与策划
Entity/EntitiesEn/Entity.cs、En/Entities.cs实体与策划基类
RowEn/Row.cs字段值容器
SqlBuilderEn/SqlBuilder.csSQL 生成
EntityDBAccessEn/EntityDBAccess.cs捏久化实行
QueryObjectEn/QueryObject.cs查询构造器
EnDtl/AttrOfOneVSMEn/EnDtl.cs、En/MapExt/AttrOfOneVSM.cs从表与多对多
MapAttrSys/MapAttr.cs低代码字段元数据(库表)
MapData/MapDtlSys/MapData.cs、Sys/MapDtl.cs表单/从表界说
SFTable/SFDBSrcSys/SFTable.cs、Sys/SFDBSrc.cs外部数据源 开云的登录网址

备案号: