2017-03-09 77 views
0

我目前使用SAPUI5/OpenUI5來使用和修改OData服務。SAPUI5 OData - 如何創建與現有實體關聯的新條目?

我想創建了一個HTTP POST請求一個新產品進入和有問題正確配置的關聯到一個類別。由於發展的原因,我將此參考文獻OData Servicemetadata一起使用。產品已將NavigationProperty添加到正確的類別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和信息的新類別(這是否意味着「深度插入」?),但我想使用選定的類別(當然)。

我一定要參考不同類別或我可以創建關聯手動不知何故? OData服務不應檢查類別ID是否已存在,然後使用現有條目?

是否有這種情況的最佳做法?

回答

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) {...} 
}); 
+0

大,非常感謝你! –