SAPUI5 OData - 如何创建与现有实体关联的新条目?

SAPUI5 OData - How to create new entry with association to existing entity?

我目前正在使用 SAPUI5/OpenUI5 来使用和修改 OData 服务。

我想通过 HTTP POST 请求创建一个新的产品条目,但在正确配置与类别的关联时遇到问题。出于开发原因,我使用了参考 OData Service with this metadata。产品已具有右侧类别条目集的 NavigationProperty。

<NavigationProperty Name="Category" Relationship="ODataDemo.Product_Category_Category_Products" FromRole="Product_Category" ToRole="Category_Products"/>

我在控制器中使用以下 JavaScript 代码:

var oCategory = oModel.getData("/Categories(0)");
var oEntry = {};
oEntry.ID = "10";
oEntry.Name = "Beer";
oEntry.Category = oCategory;

oModel.create("/Products", oEntry, {
    method: "POST",
    success: function(data) {...},
    error: function(response) {...}
});

产品已成功创建 /Products(10) 但与现有类别的关系 /Products(10)/Category 无法正常工作。取而代之的是创建一个具有相同 ID 和信息的新类别(这意味着 'deep insert' 吗?)但我想使用选定的类别(当然)。

我是否必须以不同方式引用类别,或者我是否可以以某种方式手动创建关联? OData 服务不应该检查类别 ID 是否已经存在然后使用现有条目吗?

是否有针对此类情况的最佳做法?

请务必注意,您使用的是 OData V2 服务。是的,通过按照您的方式构建请求,您实际上是在进行深度插入。

如果您考虑一下,这是有道理的,因为您不需要将整个类别信息发送到 link 新产品到现有类别。如果您要更改类别数据中的某些内容怎么办?深度插入是否会导致更新?

无论如何,OData v2 都有一个叫做 "links" 的东西(参见 OData 术语 - www.odata.org). Basically each "association" between entities is represented through such a link. You can manage these links separately from the entity (e.g. you can remove and create links between existing entities; without having to change the entity itself - see the OData v2 operations,第 2.9 到 2.12 章)。

根据您使用的数据格式(默认情况下,JSON 如果您使用 sap.ui.model.odata。v2.ODataModel),您可以创建实体 links在创建新实体的同时。查看此答案:.

简而言之,您必须按照以下方式编写内容:

oModel.create("/Products", {
    ID: "10",
    Name: "Beer",
    Category: {__metadata: {uri: "/Categories(0)"}}
}, {
    method: "POST",
    success: function(data) {...},
    error: function(response) {...}
});