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

时间:2017-03-09 14:52:08

标签: javascript odata sap sapui5

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

我想通过HTTP POST请求创建新的产品条目,并且在将关联正确配置到类别时遇到问题。出于开发原因,我使用OData Service引用metadata。产品已将NavigationProperty安装到正确的Category EntrySet。

<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和信息的新类别(这意味着&#39;深插入&#39;?)但我想使用当选类别(当然)。

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

此类案件是否有最佳做法?

1 个答案:

答案 0 :(得分:0)

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

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

在任何情况下,OData v2都有一个叫做“链接”的东西(参见OData术语 - www.odata.org)。基本上,实体之间的每个“关联”通过这样的链接来表示。您可以与实体分开管理这些链接(例如,您可以删除并创建现有实体之间的链接;无需更改实体本身 - 请参阅OData v2 operations,第2.9至2.12章)。

根据您使用的数据格式(默认情况下,如果使用sap.ui.model.odata.v2.ODataModel,则为JSON),您可以在创建新实体时同时创建实体链接。看看这个答案:https://stackoverflow.com/a/4695387/7612556

简而言之,你必须写下以下内容:

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