2

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

我想通过 HTTP POST 请求创建一个新产品条目,并且在正确配置与类别的关联时遇到问题。出于开发原因,我使用带有此元数据的参考OData 服务。Product 已经具有正确 Category EntrySet 的 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 和信息的新类别(这是否意味着“深度插入”?)但我想使用选定的类别(当然)。

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

这种情况有什么最佳实践吗?

4

1 回答 1

4

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

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

在任何情况下,OData v2 都有一个叫做“链接”的东西(请参阅 OData 术语 - www.odata.org)。基本上,实体之间的每个“关联”都是通过这样的链接来表示的。您可以与实体分开管理这些链接(例如,您可以在现有实体之间删除和创建链接;无需更改实体本身 - 请参阅OData v2 操作,第 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) {...}
});
于 2017-03-09T19:56:41.960 回答