多态对象类 Poly Items 建模
在企业建模中,我们经常遇到需要将多个完全不同物理结构的 ItemType 视为同一种类型进行统一处理的场景。例如:
- 企业的交付文档(
Document)和设计图纸(CAD Document)结构不同,但它们在“发布审批”、“下发分发”时需要被视作同等的“受控文档(Controlled Document)”对待。 - 制造系统的 零件 (Part)、辅料 (Material) 和 服务性采购项 (Service),在“合同关联”或“设计受控”时都应属于“采购目录项 (Catalog Item)”。
为了应对这类复杂的面向对象多态设计需求,Aras Innovator 提供了 Poly Item (多态类/虚基类) 机制。
1. 多态类的设计原理
在 Aras 中,Poly Item 相当于面向对象编程中的**“接口(Interface)”或“抽象基类(Abstract Class)”**:
- Poly Item (虚基类):它本身也是一个 ItemType,但它不对应真实的物理数据表。数据库中只会为它生成一个 SQL View (数据库视图)。
- Member ItemType (实体类/派生类):这是真实存储物理数据的普通 ItemType(如
Part,Material)。 - Common Properties (公共属性):Poly Item 上定义的所有属性都必须映射到每个 Member ItemType 对应的物理属性上。
2. 底层数据库视图 (SQL View) 实现
当你在 Aras 中创建了一个名为 Catalog_Item 的 Poly Item,并在其下关联了 Part 和 Material 两个 Member 项,Innovator 的数据元引擎会自动在 SQL Server 中生成一个类似于如下逻辑的视图:
sql
CREATE VIEW [innovator].[CATALOG_ITEM] AS
SELECT
id,
item_number AS item_number,
name AS name,
unit_price AS unit_price,
'Part' AS itemtype -- 记录原始的成员类类型
FROM [innovator].[PART]
UNION ALL
SELECT
id,
item_number AS item_number,
name AS name,
unit_price AS unit_price,
'Material' AS itemtype
FROM [innovator].[MATERIAL]这意味对 Poly Item 的 GET(检索)操作在数据库底层会被透明地翻译为对所有 Member 物理表的 UNION ALL 查询,从而极大地简化了多类型关联时的 AML 编写。
3. 配置 Poly Item 的步骤
步骤一:创建 Poly Item
- 进入管理端 -> ItemTypes,新建一个 ItemType(如
Catalog_Item)。 - 在 Implementation Type 下拉框中,选择 Polymorphic(多态)。
步骤二:指定 Member ItemType (成员类)
- 保存新建的多态类后,切换到 Morphae(多态子类) 关系选项卡(仅当选择 Polymorphic 后才可见)。
- 将真实的实体类(如
Part,Material)添加为 Morphae 成员。
步骤三:映射公共属性 (Common Properties)
- 在 Poly Item 的 Properties 列表中定义所需的公共字段(例如
item_number,name,unit_price)。 - 进入各个成员 Morphae 记录的编辑窗口。
- 建立映射关系:为每一个 Morphae 成员显式地配置“公共属性对应其哪一个私有物理字段”。例如,Poly Item 上的
name可以映射为Part的name属性,以及Material的mat_name属性。
步骤四:配置 TOC 导航与权限
- 你可以将 Poly Item 添加到 TOC。当用户在左侧菜单点击“采购目录项列表”时,系统会列出统一的公共网格,包含了
Part与Material的混合数据。 - 可以对 Poly Item 配置统一的权限控制,这会覆盖或叠加上游的成员权限。
4. 多态类与关系类关联
Poly Item 在定义“一对多”或“多多关联”时具有极高的系统架构价值。
- 问题背景:如果你想在“设计变更请求 (Change Request)”的底部 Tab 页中关联所有受变更影响的实体对象(这些对象可能是
Part,也可能是Document或Software_Package)。 - 常规做法:在 Change Request 下分别建立三个关系类。这会导致前端界面需要展示 3 个不同的 Tab 标签,且难以进行总体的状态管控。
- Poly Item 做法:
- 建立一个名为
Affected_Item的 Poly Item,将Part,Document,Software_Package设为 Morphae 成员。 - 在 Change Request 下仅配置一个指向
Affected_Item的关系类。 - 前端将呈现一个统一的 Tab 页,用户在点击添加时,弹窗会让用户选择“你要添加 Part 还是 Document?”选择完成后,它们将以统一的网格结构平铺在同一个界面里。
- 建立一个名为
5. 多态建模的关键限制
多态建模的关键限制
- 主键唯一性:虽然 Aras 自动生成的 GUID 在全系统是全球唯一的,但如果人工向多态类成员中插入了重复 ID,多态视图查询将会报错。
- 不可直接插入 (Read-Only View):不能直接对多态类执行
add操作。任何新增记录的事务都必须针对具体的成员实体类(如Part)发起,然后再通过 Poly 视图进行查询呈现。
