Web API 导航属性

CSDL $metadata文档中,不抽象的每个实体类型都有 NavigationProperty 元素。 NavigationProperty 元素描述与当前实体类型相关的数据。 检索记录时,可以展开导航属性以包含相关数据。

下表描述了元素的属性 NavigationProperty

Attribute Description
Name 导航属性的名称;区分大小写
Type 相关的实体类型;可以是单个值或类型的集合
Partner 关系另一端的导航属性的名称
Nullable="false" 值是否可以为 null

重要

有两种类型的导航属性: 单值集合值。 这一区别很重要,因为每种导航属性的功能都不同。

使用 OData 构造查询时,我们不引用一对多、多对一或多对多关系。 这两种类型的导航属性描述如何导航这些关系。

单值导航属性

当导航属性 Type 引用单个值时,它表示一对多关系,该关系创建对另一个表记录的引用。 此关系通常称为 查找。 以下示例是 accountcreatedby 导航属性:

<NavigationProperty 
    Name="createdby" 
    Type="mscrm.systemuser" 
    Nullable="false" 
    Partner="lk_accountbase_createdby">
    <ReferentialConstraint 
        Property="_createdby_value" 
        ReferencedProperty="systemuserid" />
</NavigationProperty>

此单值导航属性将多个 account 记录连接到单个 systemuser 记录。 每个 systemuser 记录都有一个名为 lk_accountbase_createdby 的集合值导航属性,将其与用户创建的 account 记录连接起来。

这些值存储在关系定义中。 可以使用 SDK OneToManyRelationshipMetadata 或 Web API OneToManyRelationshipMetadata 实体类型访问它们,如下表所述。

Attribute OneToManyRelationshipMetadata 属性 Description
Name ReferencingEntityNavigationPropertyName 单值导航属性的名称。
Partner ReferencedEntityNavigationPropertyName 集合值导航属性的名称。

查找属性

单值导航属性具有一个带有 Property 属性的 ReferentialConstraint,该属性引用查找属性。 查找属性使用以下命名约定: _<name>_value 了解有关查找属性的详细信息

ReferentialConstraint 属性标识相关实体类型的ReferencedProperty主键名称。

在大多数情况下,在查找属性中找到的<name>与导航属性的名称完全匹配,除非单值导航属性表示多表查找。

多表查找

当单值导航属性是多表或多态查找的一部分时,单个查找属性是多个单值导航属性的 ReferentialConstraint

实体类型可能具有以下组合,其中单个 _customerid_value 查找属性支持表示多表查找的多个单值导航属性。 多表查找支持的每种类型的表都有一个单值导航属性。

<EntityType 
    Name="socialprofile" 
    BaseType="mscrm.crmbaseentity">
    <Key>
        <PropertyRef Name="socialprofileid" />
    </Key>
    <Property 
        Name="_customerid_value" <!-- lookup property -->
        Type="Edm.Guid">
        <Annotation 
            Term="Org.OData.Core.V1.Description" 
            String="Shows the customer that this social profile belongs to." />
    </Property>
    <NavigationProperty 
        Name="customerid_contact" <!-- Name different from lookup property -->
        Type="mscrm.contact" 
        Nullable="false" 
        Partner="Socialprofile_customer_contacts">
        <ReferentialConstraint 
            Property="_customerid_value" <!--  Reference to lookup property  -->
            ReferencedProperty="contactid" />
    </NavigationProperty>
    <NavigationProperty 
        Name="customerid_account" <!-- Name different from lookup property -->
        Type="mscrm.account" 
        Nullable="false" 
        Partner="Socialprofile_customer_accounts">
        <ReferentialConstraint 
            Property="_customerid_value"  <!--  Reference to lookup property  -->
            ReferencedProperty="accountid" />
    </NavigationProperty>
</EntityType>

在这些情况下,将任一单值导航属性的值设定后,所有其他相关的单值导航属性值都将被设置为 null。 相应的查找属性 GUID 值会更改,但你需要检索特定的批注,以了解它现在引用的表。 详细信息: 查找属性数据

集合值导航属性

当导航属性 Type 引用集合值时,它表示多对一或多对多关系。 以下示例是帐户实体 Account_Tasks 导航属性:

<NavigationProperty 
    Name="Account_Tasks" 
    Type="Collection(mscrm.task)" 
    Partner="regardingobjectid_account_task" 
/>

此导航属性将记录 account 连接到许多 task 记录。 每个 task 都有一个名为 regardingobjectid_account_task 的单值导航属性,用于指向 account 作为相关对象。

使用 OData 处理集合值导航属性的方式是相同的,无论关系是一对多还是多对多。 这两个集合都被视为集合,你与它们交互的方式相同。

多对一关系

多对一关系是“一对多”关系的镜像。 它具有合作伙伴单值导航属性。 在前面的单值导航属性示例中,我们查看了account实体类型的createdby单值导航属性。

systemuser 实体类型中,名为 lk_accountbase_createdby 的集合值导航属性合作伙伴存在。

<NavigationProperty Name="lk_accountbase_createdby"
    Type="Collection(mscrm.account)"
    Partner="createdby" />

多对多关系

当集合型导航属性的NamePartner相同时,它表示多对多关系。

多对多关系的某些实现详细信息可以在服务文档中找到。 对于大多数用例,可以忽略它们。

例如,每个多对多关系都有一个支持它的相交表。 这些相交表中的实体类型通常具有四个只读属性。 在以下示例中,teammembership实体类型是一个交叉表,支持systemuserteam实体类型之间的多对多关系:

<EntityType Name="teammembership"
    BaseType="mscrm.crmbaseentity">
    <Key>
        <PropertyRef Name="teammembershipid" />
    </Key>
    <Property Name="systemuserid"
        Type="Edm.Guid" />
    <Property Name="versionnumber"
        Type="Edm.Int64" />
    <Property Name="teammembershipid"
        Type="Edm.Guid" />
    <Property Name="teamid"
        Type="Edm.Guid" />
</EntityType>

不能直接处理表示相交表的实体类型,因为所有属性都是只读的。 针对每个实体类型的集合值导航属性执行操作。 详细信息: 使用 Web API 关联和取消关联表行

对于此多对多关系, systemuser 实体类型具有以下集合值导航属性:

<NavigationProperty Name="teammembership_association"
    Type="Collection(mscrm.team)"
    Partner="teammembership_association" />

实体 team 类型具有此集合值导航属性:

<NavigationProperty Name="teammembership_association"
    Type="Collection(mscrm.systemuser)"
    Partner="teammembership_association" />

这些值存储在关系定义中。 可以使用 SDK ManyToManyRelationshipMetadata 或 Web API ManyToManyRelationshipMetadata 实体类型访问它们,如下表所述。

Attribute ManyToManyRelationshipMetadata 属性 Description
Name Entity1NavigationPropertyName 某一实体类型的集合值导航属性的名称
Partner Entity2NavigationPropertyName 其他实体类型的集合值导航属性的名称

后续步骤

了解有关操作定义。

另请参阅

Web API 类型和操作
Web API 服务文档
Web API EntityTypes
Web API 属性
Web API动作
Web API 函数
Web API 复杂和枚举类型
使用 Dataverse Web API
OData 版本 4.0。 第 3 部分:通用架构定义语言 (CSDL) 加上 Errata 03 7.1 元素 edm:NavigationProperty