Entity之间用Association来表示关联关系,可以同CDS view中的Association一起理解。
我们在上次已经建好实体Item的基础上,再建一个Header,其方法的重写也参考Item即可,然后开始本篇的探索。
一,构建Association
1.1 新建Association
右键Association新建,弹出如下窗口,填入关联名称。
上图红框:左右EntityType填入两个关联的Entity,然后是两个Entity的关联基数。
上图紫框:勾选Create Navigation Property会为EntityType生成一个NavigationProperty(如图3粉框),表示了entity之间的导航路径(详见第二节),如左紫框表示了Header到Item的导航,右紫框表示Item到Header的导航。我们可以只勾选一边,代表只建立单侧的导航。
1.2 指定关联字段
指定两个Entity关联的字段,类似两个表的join字段。注意匹配的字段其数据类型也要一致,且不能使用数量金额作为关联字段。
1.3 Association生成对象
在Association保存之后会生成一些新的对象,如下图内容:
NavigationProperties:这个很重要,表示了entity之间是否能够导航,
Association:展示了关联名,以及关联字段
Association Set:似乎没什么要注意的
二,测试与报文分析
2.1 读取Header实体
使用Postman测试一下获取Header的实体,得到atom格式报文如下,我精简了一些element和attribute。
<?--请求地址 https://{{host}}:{{port}}/sap/opu/odata/sap/Y_TEST_ODATA4_SRV/HeaderSet('4500000001')-->
<?xml version="1.0" encoding="utf-8"?>
<entry xml:base="https://xxxxxx:44301/sap/opu/odata/sap/Y_TEST_ODATA4_SRV/">
<category term="Y_TEST_ODATA4_SRV.Header"/>
<link href="HeaderSet('4500000001')" rel="self" title="Header"/>
<link href="HeaderSet('4500000001')/Header_To_Item" title="Header_To_Item"/>
<content type="application/xml">
<m:properties>
<d:DOCNO>4500000001</d:DOCNO>
<d:VENDOR>XA016</d:VENDOR>
</m:properties>
</content>
</entry>
我们在请求地址中指明了entity的key,所以会执行get_entity方法。
从报文可以看到有两个Link:
HeaderSet('4500000001')" />
这是一个自连接指向Entity自身,每个Entity都会包含自连接,href是相对路径加上服务的前置路径就能得到指向Entity的完整URL
https://xxxxxx:44301/sap/opu/odata/sap/Y_TEST_ODATA4_SRV/HeaderSet('4500000001')
HeaderSet('4500000001')/Header_To_Item" />
由Association生成的连接,导航到相关的EntitySet,那么本例根据Header导航到行项目的URL就是
https://xxxxxx:44301/sap/opu/odata/sap/Y_TEST_ODATA4_SRV/HeaderSet('4500000001')/Header_To_Item
如果Header还有到其他实体的导航,比如到供应商主数据,就会有多个导航Link
2.2 使用Header到Item的导航
在上一步我们知道了Header到Item的导航地址,我们放到postman中测试一下。
在报文中我们看到返回的就是Item内容,而每个Item中又包含一个link可以导航到其Header。注意:如果图1右紫框没有勾选,那么这里就没有导航到Header的link。
由于图1中维护的关联基数是1:N,所以在导航到item时执行的是item的get_entityset方法,如果是1:1则执行的是get_entity方法
2.3 指令$expand
https://{{host}}:{{port}}/sap/opu/odata/sap/Y_TEST_ODATA4_SRV/HeaderSet('4500000001')?$expand=Header_To_Item
如上查询指令:也是利用导航来关联entity的,与2.2小节导航不同的是该指令返回的报文同时包含了Header和Item两个实体,参考下一篇笔记的$expand