Создать NavigationProperty в модели UI5 OData v4 - PullRequest
0 голосов
/ 23 мая 2018

Уважаемые эксперты по UI5!

Я столкнулся с проблемой переплета с моделью OData v4.У меня есть простая OData-структура с персонами, назначаемыми отделу, см. Выдержку из metadata.xml:

... 
<EntityType Name="Person">
        <Key>
            <PropertyRef Name="Id"/>
        </Key>
        <Property Name="Id" Type="Edm.Int64"/>
        <Property Name="FirstName" Type="Edm.String"/>
        <Property Name="LastName" Type="Edm.String"/>
        <Property Name="Email" Type="Edm.String"/>
        <Property Name="Mobile" Type="Edm.String"/>
        <Property Name="Username" Type="Edm.String"/>
        <NavigationProperty Name="Department" Type="OData.WTS.Department" Partner="Person"/>
</EntityType>

<EntityType Name="Department">
        <Key>
            <PropertyRef Name="Id"/>
        </Key>
        <Property Name="Id" Type="Edm.Int64"/>
        <Property Name="Name" Type="Edm.String"/>
        <NavigationProperty Name="Person" Type="OData.WTS.Person" Partner="Department"/>
</EntityType>
...

Теперь я хочу создать UI5-приложение, которое позволяет пользователям создавать новых людей, которые должны быть назначеныв отдел (который должен быть выбран через ValueHelp).Поэтому я создал страницу списка, элементы которой привязаны к модели:

<Table items="{ path: 'userService>/Persons', parameters : {$expand: 'Department'} }">
    ...
</Table>

Сам отдел связан в виде XML:

...
<form:FormElement>
    <form:label>
        <Label text="{i18n>User.Department}"/>
    </form:label>
    <form:fields>
        <Input id="Department"
               name="{userService>Department/Id}"
               value="{userService>Department/Name}"
               showValueHelp="true" valueHelpOnly="true"
               valueHelpRequest="onValueHelpRequestDepartment" />
    </form:fields>
</form:FormElement>
...

Когда пользователь нажимает накнопку «Новый человек», я создаю новую запись модели переходного процесса через OData v4 ListBindingContext:

oListBindingContext
    .create({
            Id: null,
            Username: "",
            FirstName: "",
            LastName: "",
            Email: "",
            Mobile: "",
            Department: {
                Id : null,
                Name : null
            }
        }, function (oError) {
            // handle error
        }
    );

Когда пользователь теперь выбирает отдел с помощью ValueHelp, я хочу назначить его Id и назовите недавносоздан Идентификатор и Имя отдела.Я пытаюсь сделать это через setter-функции Input-control, поскольку свойства привязаны к отделу:

// this should update the model-value
var oInput = this.getView().byId("Department");
oInput.setName(sSelectedId);
oInput.setValue(oSelectedBindingContext.getProperty("Name"));

Но это приводит к исключению:

Failed to update path /Persons/-1/Department/Name - Error: /Persons/-1/Department/Name: No key predicate known at /Persons/-1/Department
    at error (http://localhost/ui5resources/sap/ui/model/odata/v4/ODataMetaModel-dbg.js?eval:1189:10)
    at eval (http://localhost/ui5resources/sap/ui/model/odata/v4/ODataMetaModel-dbg.js?eval:1297:7)
    at new SyncPromise (http://localhost/ui5resources/sap/ui/model/odata/v4/lib/_SyncPromise-dbg.js?eval:72:15)
    at SyncPromise.then (http://localhost/ui5resources/sap/ui/model/odata/v4/lib/_SyncPromise-dbg.js?eval:151:12)
    at eval (http://localhost/ui5resources/sap/ui/model/odata/v4/ODataMetaModel-dbg.js?eval:1288:47)

Делаете ли выесть какие-либо советы, как реализовать этот простой сценарий с OData v4?Я неправильно понимаю концепцию OData v4 здесь?Я использую OpenUI5 версии 1.50.6.

Заранее спасибо :-) Mirco

...