有没有办法创建一个"临时" (或者我猜它被称为虚拟)深度实体使用oModel.createEntity()
?
我有一个名为Timesheet的实体,其中包含一个断点关联,称为ToBreaks。
现在我想通过使用在前端创建一个新实体
oModel.createEntity("/TimesheetSet")
。
不幸的是,在所谓的虚拟新条目中,我的所有关联都丢失了。
因为我使用绑定表的配置,所以在创建虚拟新条目后,会触发后端调用
TimesheetSet("id-04-123456789")/ToBreaks
导致"无效的密钥谓词"错误。
有没有办法用OData V2做到这一点?
更新09.08.2016:
您仍然可以尝试只使用带有嵌套实体集的properties参数。只要您的OData服务支持相应的深度创建,它就应该起作用:
我也尝试过这样的事情:
oModel.createEntry("/TimesheetEntry", {
Pernr: sPernr,
Begda: dBegda,
ToBreaks: [{
Pernr: sPernr,
Begda: dBegda
}]
});
ToBreaks
是该关联的名称。
在OData-Model的虚拟条目中,仍然缺少关联的属性。我可以使用上面的代码创建新条目,但之后没有名为ToBreaks
在后端,我按照本教程实现了deep_create方法:step-by-step-development-guide-for-createdeepentity-operation。我能够从SAP Gateway Client中触发该方法。
答案 0 :(得分:2)
来自API docs:
请注意,不支持深度创建(包括由navigationproperties定义的数据)。
您仍然可以尝试将properties
参数与嵌套实体集一起使用。只要您的OData服务支持相应的深度创建,它就应该起作用:
属性可以是一个对象,它包含所需的属性以及应该用于创建的条目的值。
答案 1 :(得分:1)
是的,您可以使用oData V2执行深层实体创建。为此,您需要根据元数据结构构建请求体。 假设您的元数据模型是用户,并且每个用户都有多个通信。所以我们有一个用户实体和通信实体。我们还有 fromUserToCommunications 和导航属性的关联,我们称之为通讯
要执行深度创建用户实体的调用,您需要执行以下操作:
// Create the oData Model
var oModel = new sap.ui.model.odata.ODataModel("{YOUR_SERVICE_DOCUMENT_URL}");
// Create the user request body, please make sure that
// all required fields are filled in and are according to the
// user entity metadata
var userRequestBody = {
id: "123",
firstName: "Your First Name",
lastName: "Your Last Name",
address: "Your Address",
communications: [] // contain multiple communications
};
var comm1 = {
id : "1",
userId : "123", // foregin key to the user entity
homePhone: "+134342445435"
};
var comm2 = {
id : "2",
userId : "123", // foregin key to the user entity
homePhone: "+134342445436"
};
// add the communications to the user entity
userRequestBody.communications.push(comm1);
userRequestBody.communications.push(comm2);
oModel.create("/UserCollection",userRequestBody,{
success: function(result){
// everything is OK
},
error: function(err){
// some error occuerd
},
async: true, // execute async request to not stuck the main thread
urlParameters: {} // send URL parameters if required
});
答案 2 :(得分:0)
您可以通过创建子代并手动更新父对象上的Navigation属性来创建深度虚拟实体:
// oStartContext is a client side object representation
oStartContext = oModel.createEntry("/YourObjectSet", { properties: oYourObjectData });
aChildren
是孩子的数组对象
var aChildren = [];
var aChildrenCtx = "";
var aChildrenEntries = [];
for(var i = 0; i < aChildren.length; i++) {
var entry = aChildren[i];
aChildrenCtx = oModel.createEntry("/YourObjectChildSet",
{
properties: entry,
context: oStartContext
}
);
aChildrenEntries.push(aChildrenCtx.getPath().substring(1));
}
手动将ObjectChild_R关系重置为客户端对象表示形式
modelData.setProperty("ObjectChild_R", aChildrenEntries, oStartContext);