我目前正在使用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服务是否应该检查,然后使用现有条目?
此类案件是否有最佳做法?
答案 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) {...}
});