如何使用oModel.createEntry

时间:2016-08-06 09:37:07

标签: odata sap sapui5

有没有办法创建一个"临时" (或者我猜它被称为虚拟)深度实体使用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中触发该方法。

3 个答案:

答案 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);