Odata Vch 中的双向导航
Bi-directional navigation in OData V4
* 如果它能解决我的问题(如果你没有详细的规范解决方案),我会接受赏金的答案 *
当我尝试从浏览器 (http://......Service.svc/$metadata) 访问元数据时,我看到以下错误。
500
Cannot find navigation property with name:
projectConfigs at type ProjectConfig
我正在尝试在 OData v4 中设计双向关联(我正在使用 Partner,还有其他可用的方式吗?!)。我不确定我在实施它时犯了什么错误。
我有两个 类 即“Project”和“ProjectConfig”。我需要从 Project 导航到 ProjectConfig,反之亦然。这个想法是,对于一个已定义的项目,我应该能够看到 ProjectConfig(urations),然后我想从那里导航回到它所属的项目。
我正在使用 Olingo 框架编写应用程序代码。 This is the example i followed.
我在此示例中看到的挑战是导航名称 "Products" 和 EntitySet 名称 "Products" 相同。
据我了解,当我们在导航中定义合作伙伴时,我们应该能够在 "Nav Type" 中找到具有相同名称的 属性。这将理想地将导航设置回实体类型。
我已经粘贴了感兴趣的元数据和 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);
}
如果需要,我可以提供任何遗漏的细节! :) 无法得到回应!不确定,如果我的问题与一个小社区有关!!
我想问题的根源在于用于 NavigationProperty 名称和 NavigationPropertyBinding 路径的字符大小写不同。
考虑对所有 属性 个名称使用大驼峰式大小写。
在命名实体集ProjectConfigs
的导航属性时,使用路径Projects
(复数形式)进行实体集属性的导航属性绑定还有另一个问题ProjectConfig
as project
(单数形式)。
* 如果它能解决我的问题(如果你没有详细的规范解决方案),我会接受赏金的答案 *
当我尝试从浏览器 (http://......Service.svc/$metadata) 访问元数据时,我看到以下错误。
500
Cannot find navigation property with name: projectConfigs at type ProjectConfig
我正在尝试在 OData v4 中设计双向关联(我正在使用 Partner,还有其他可用的方式吗?!)。我不确定我在实施它时犯了什么错误。
我有两个 类 即“Project”和“ProjectConfig”。我需要从 Project 导航到 ProjectConfig,反之亦然。这个想法是,对于一个已定义的项目,我应该能够看到 ProjectConfig(urations),然后我想从那里导航回到它所属的项目。
我正在使用 Olingo 框架编写应用程序代码。 This is the example i followed.
我在此示例中看到的挑战是导航名称 "Products" 和 EntitySet 名称 "Products" 相同。
据我了解,当我们在导航中定义合作伙伴时,我们应该能够在 "Nav Type" 中找到具有相同名称的 属性。这将理想地将导航设置回实体类型。
我已经粘贴了感兴趣的元数据和 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);
}
如果需要,我可以提供任何遗漏的细节! :) 无法得到回应!不确定,如果我的问题与一个小社区有关!!
我想问题的根源在于用于 NavigationProperty 名称和 NavigationPropertyBinding 路径的字符大小写不同。 考虑对所有 属性 个名称使用大驼峰式大小写。
在命名实体集ProjectConfigs
的导航属性时,使用路径Projects
(复数形式)进行实体集属性的导航属性绑定还有另一个问题ProjectConfig
as project
(单数形式)。