使用关联和成分

Objective

After completing this lesson, you will be able to 使用关联捕获实体之间的关系

托管对一”关联

关联用于定义实体之间的关系。

在"从工作簿到作者的关联"图中所示的示例中,通过Books 实体中的 author 元素定义 Books 和 Authors 之间的关联。此元素创建到"作者"实体的链接,建立一种关系,用户可以在其中从工作簿实体导航到关联的作者以检索更多详细信息,例如作者的姓名。

幕后

示例代码中的对一关联 Books:author 是所谓的托管关联,其中外键字段和 on 条件自动添加到后台。

基于目标的主键(即作者实体),CDS 会在激活时自动将外键字段 author_ID 添加到 SQL 数据库(请参阅图生成的外键字段)并隐式添加相应的连接条件。

除管理关联外,我们还可以使用非托管关联。非托管关联在其 on 子句中显式指定任意连接条件,该子句引用可用的外键字段。

注意

为了让模型简洁、易于理解,应始终倾向于将管理关联用于一对一关联。

接下来,我们将介绍一对多关联的示例。

对多关联

作者可以编写任意数量的书,即作者可以与无、一本书或多本书相关联。

从作者到书的关联显示了如何在 CDS 模型中定义此类对多个关联。

"作者"实体和"工作簿"目标实体之间的关系由"作者"实体中的 books 元素指定。语法 Association to many Books 表示作者与任意数量的书相关联。

on 条件中,关联名称工作簿用作要链接的工作簿目标实体的别名。子句 on books.author = $self 指定 Books 实体中的作者字段用于创建到作者实体的链接。$self 是引用作者当前实例的占位符。

通常,根据下列模式在 on 条件中为对多关联指定表达式:

<assoc>.<backlink> = $self

反向链接可以是指向一方的任意管理关联,指向一侧。

注意

CDS 当前不为多对多关联提供任何特殊支持。因此,必须使用链接实体将多对多关联解析为两个一对多关联以连接两者。

成分

除关联外,CAP 还支持成分建模。

关联与可以彼此独立的实体(如作者和书)相关联。

另一方面,构成表示内含关系,用于对文档结构建模。它们经常显示在多个抬头-子场景中 - 例如订单和订单项目。

构成表示子实体(订单项目)是整体的一部分,不能独立于父实体(订单)存在。子实体包含在父实体中,只能通过父实体访问。

"成分示例"图演示了如何在 CDS 中定义成分。显示的构成定义了订单和订单项目之间的一对多关系。语法与一对多关联的定义非常相似。唯一的区别在于:侧有 子句 Composition of 而不是 子句 Association to(比较上述 authors 和 books 之间的关联)。

CAP 运行时在某些方面对成分与关联的处理方式不同。此外,还有以下特殊成分功能:

  • 级联删除

    由于成分关系,删除订单也会导致删除其所有订单项目。

  • 深度插入

    在生成的 OData 服务中,订单和包含的订单项目都可以通过单个 POST 请求创建。

接下来,我们来看一下如何在服务接口中公开关联。

在服务接口中公开关联

在预测中发布关联

您可以将常规元素等关联添加到视图的选择列表 (as select from) 或投影 (as projection on)。select * 包括所有关联。

公开预测显示了我们场景中的两个投影 AdminService.BooksAdminService.Authors,它们通过 AdminService 公开。AdminService.Books 投影的有效签名包含作者关联,其属性与 com.sap.learning.Books 实体的作者关联相同。同样,AdminService.Authors 投影的签名包含与 com.sap.learning.Authors 实体的books 关联属性相同的书籍关联。

自动重定向关联

"公开预测"图中显示的 AdminService 公开了对基础数据模型中实体的两个投影。

公开相关实体时,会自动重定向关联。这可确保客户能够按预期在预计实体之间进行导航(请参阅图重定向关联)。这意味着 AdminService.Authors.books 指向 AdminService.Books - 而不是 com.sap.learning.Books。同样,AdminService.Books.author 是指 AdminService.Authors - 而不是 com.sap.learning.Authors

导航属性

在生成的 OData 服务中,已发布的关联可用作具有相同名称的导航属性。

"生成的导航属性"一图显示了服务元数据文档的相应摘录。实体类型 Books 具有导航属性作者,实体类型 Authors 具有导航属性 books

演示和练习:向域模型添加关联

注意

在练习中,在 SAP Business Application Studio 中自行执行以下演示中的分步说明。

作为练习的起点,如果成功完成,请使用先前练习设置含用于开发的初始数据的持久 SQLite 数据库的结果。或者,您还可以使用以下 GitHub 资源库中的分支 4_SQLite_database 作为起点:

https://github.com/SAP-samples/cap-development-learning-journey

可在 GitHub 资源库的 5_associations 分支中找到模拟的完整实施。

有关资源库内容及其使用方法的详细信息,可在此处找到。

观看视频,了解如何向域模型添加关联。

接下来,我们将了解如何使用所谓的方面通过新元素扩展实体定义。