Двунаправленная навигация в OData V4 - PullRequest
4 голосов
/ 04 октября 2019

* Я приму ответ с наградой, если он просто решит мою проблему (если у вас нет подробного канонического решения) *

Когда я пытаюсь получить доступ к метаданным избраузер ( http: //......Service.svc/$metadata), я вижу ошибку ниже.

500 Не удается найти свойство навигации с именем:projectConfigs типа ProjectConfig

Я пытаюсь создать двунаправленную ассоциацию в OData v4 (я использую Partner, любой другой доступный способ ?!). Я не уверен, какую ошибку я совершаю при ее реализации.

У меня есть два класса, а именно «Project» и «ProjectConfig». Мне нужна навигация от Project к ProjectConfig и наоборот. Идея состоит в том, что для определенного проекта я должен иметь возможность видеть ProjectConfig (urations), и оттуда я хочу вернуться обратно к проекту, которому он принадлежит.

Я использую Olingo Framework для написания кода приложения. Это пример, которому я следовал.

Проблема, которую я вижу в этом примере, состоит в том, что имя навигации "Продукты" и имя EntitySet "Продукты" совпадают.

Насколько я понимаю, когда мы определяем партнера в навигации, мы должны быть в состоянии найти свойство с тем же именем в "Типе навигации". Это идеально настроит навигацию обратно к типу сущности.

Я вставил метаданные и код приложения Java, который представляет интерес.

metadata.xml

<EntityType Name="Project">
    <Key>
        <PropertyRef Name="id"/>
    </Key>
    <Property Name="id" Type="Edm.Int32"/>
    <Property Name="name_artifact_id" Type="Edm.String"/>
    <Property Name="groupid" Type="Edm.String"/>
    <Property Name="project_display_name" Type="Edm.String"/>

    <NavigationProperty Name="projectConfigs"
                        Type="Collection(devplatform.config.ProjectConfig)"
                        Partner="project"/>
</EntityType>

<EntityType Name="ProjectConfig">
    <Key>
        <PropertyRef Name="id"/>
    </Key>
    <Property Name="id" Type="Edm.Int32"/>

    <NavigationProperty Name="project"
                        Type="devplatform.config.Project"
                        Partner="projectConfigs"/>
</EntityType>

<EntitySet Name="Projects" EntityType="devplatform.config.Project">
    <NavigationPropertyBinding Path="ProjectConfigs" Target="ProjectConfigs"/>
</EntitySet>

<EntitySet Name="ProjectConfigs" EntityType="devplatform.config.ProjectConfig">
    <NavigationPropertyBinding Path="Projects" Target="Projects"/>
</EntitySet>

DemoEdmProvider.java

public static void main(String[] args) {
public static final String ET_PROJECT_NAME = "Project";
public static final FullQualifiedName ET_PROJECT_FQN = 
        new FullQualifiedName(NAMESPACE, ET_PROJECT_NAME);

public static final String ET_PROJECTCONFIG_NAME = "ProjectConfig";
public static final FullQualifiedName ET_PROJECTCONFIG_FQN = 
        new FullQualifiedName(NAMESPACE, ET_PROJECTCONFIG_NAME);

public static final String ES_PROJECTS_NAME = "Projects";
public static final String ES_PROJECTCONFIGS_NAME = "ProjectConfigs";

public static final String NAV_TO_PROJECT = "Project";
public static final String NAV_TO_PROJECTCONFIG = "ProjectConfig";


if (entityTypeName.equals(ET_PROJECT_FQN)) {
    List<CsdlProperty> propertyList = new ArrayList<CsdlProperty>();
    // create EntityType properties
    CsdlProperty id = 
            new CsdlProperty().setName("id")
                              .setType(EdmPrimitiveTypeKind.Int32.getFullQualifiedName());
    propertyList.add(id);
    CsdlProperty name_artifact_id = 
            new CsdlProperty().setName("name_artifact_id")
                              .setType(EdmPrimitiveTypeKind.String.getFullQualifiedName());
    propertyList.add(name_artifact_id);
    CsdlProperty groupid = 
            new CsdlProperty().setName("groupid")
                              .setType(EdmPrimitiveTypeKind.String.getFullQualifiedName());
    propertyList.add(groupid);
    CsdlProperty project_display_name = 
            new CsdlProperty().setName("project_display_name")
                              .setType(EdmPrimitiveTypeKind.String.getFullQualifiedName());
    propertyList.add(project_display_name);


    // create PropertyRef for Key element
    CsdlPropertyRef propertyRef = new CsdlPropertyRef();
    propertyRef.setName("id");

    // navigation property: many-to-one, null not allowed (product must have a category)
    List<CsdlNavigationProperty> navPropList = new ArrayList<CsdlNavigationProperty>();

    CsdlNavigationProperty projectconfigs = 
            new CsdlNavigationProperty().setName(NAV_TO_PROJECTCONFIGS)
                                        .setType(ET_PROJECTCONFIG_FQN)
                                        .setCollection(true)
                                        .setPartner("projectConfigs");
    navPropList.add(projectconfigs);


    // configure EntityType
    entityType = new CsdlEntityType();
    entityType.setName(ET_PROJECT_NAME);
    entityType.setProperties(propertyList);
    entityType.setKey(Arrays.asList(propertyRef));
    entityType.setNavigationProperties(navPropList);
}

if (entityTypeName.equals(ET_PROJECTCONFIG_FQN)) {
    List<CsdlProperty> propertyList = new ArrayList<CsdlProperty>();
    // create EntityType properties
    CsdlProperty id = 
            new CsdlProperty().setName("id")
                              .setType(EdmPrimitiveTypeKind.Int32.getFullQualifiedName());
    propertyList.add(id);

    // create PropertyRef for Key element
    CsdlPropertyRef propertyRef = new CsdlPropertyRef();
    propertyRef.setName("id");

    // navigation property: many-to-one, null not allowed (product must have a category)
    List<CsdlNavigationProperty> navPropList = new ArrayList<CsdlNavigationProperty>();

    // ERROR CAUSING LINE
    CsdlNavigationProperty project = 
            new CsdlNavigationProperty().setName(NAV_TO_PROJECT)
                                        .setType(ET_PROJECT_FQN)
                                        .setNullable(true)
                                        .setPartner("project");
    navPropList.add(project);

    // configure EntityType
    entityType = new CsdlEntityType();
    entityType.setName(ET_PROJECTCONFIG_NAME);
    entityType.setProperties(propertyList);
    entityType.setKey(Arrays.asList(propertyRef));
    entityType.setNavigationProperties(navPropList);
}

При необходимости могу предоставить любые недостающие детали! :) Не удалось получить ответы! Не уверен, если мой вопрос актуален для небольшого сообщества !!

1 Ответ

0 голосов
/ 23 октября 2019

Я думаю, корень проблемы в другом случае символов, используемых для имен NavigationProperty и путей NavigationPropertyBinding. Попробуйте использовать верхний регистр верблюда для всех имен свойств.

Существует также другая проблема при использовании пути Projects (во множественном числе) для привязки свойств навигации набора сущностей ProjectConfigs при присвоении имени свойству навигации ProjectConfig как project (в единственном числе).

...