2017-04-17 48 views
0

我使用来自Microsoft.OData.Core(et al)的ODataLib v7.1.1位构建OData服务。我在使用ODataUriParser.ParsePath()使用缩短的关键词谓词URL格式时遇到了问题。 (相对)URL Company('Comp1')/ Customer(1)“引发异常”URI中指定的键数与资源'Test.Customer'的键属性数不匹配“。OData缩短的关键谓词支持

该模型是非常简单的,我不明白为什么这是行不通的。其他格式的网址工作(“Company('Comp1')”,“Customer(CompanyId ='COMP1',CustNum = 1)”)。

我已经将模型构建器代码放在$元以下的输出中。任何帮助,将不胜感激。谢谢!

-Erik

var result = new EdmModel(); 
     var company = new EdmEntityType("Test", "Company"); 
     var companyKey1 = company.AddStructuralProperty("CompanyId", EdmPrimitiveTypeKind.String, false); 
     company.AddKeys(
      companyKey1 
      ); 
     result.AddElement(company); 


     var customer = new EdmEntityType(NS, "Customer"); 
     var customerKey1 = customer.AddStructuralProperty("CompanyId", EdmPrimitiveTypeKind.String, false); 
     var customerKey2 = customer.AddStructuralProperty("CustNum", EdmPrimitiveTypeKind.Int32, false); 

     customer.AddKeys(
      customerKey1, 
      customerKey2 
      ); 
     result.AddElement(customer); 

     var navCompanyCustomer = company.AddUnidirectionalNavigation(
      new EdmNavigationPropertyInfo() 
      { 
       ContainsTarget = true, 
       Name = "Customer", 
       Target = customer, 
       TargetMultiplicity = EdmMultiplicity.Many 
      }); 

     var customerRefToCompany = customer.AddUnidirectionalNavigation(
      new EdmNavigationPropertyInfo() 
      { 
       ContainsTarget = false, 
       Name = "Company", 
       Target = company, 
       TargetMultiplicity = EdmMultiplicity.One, 
       DependentProperties = new[] { customerKey1 }, 
       PrincipalProperties = new[] { companyKey1 } 
      }); 

     var container = new EdmEntityContainer("Test", "DefaultContainer"); 
     result.AddElement(container); 
     container.AddEntitySet("Company", company); 
     container.AddEntitySet("Customer", customer); 

     return result; 

<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx"> 
    <edmx:DataServices> 
    <Schema Namespace="Test" xmlns="http://docs.oasis-open.org/odata/ns/edm"> 
     <EntityType Name="Company"> 
     <Key> 
      <PropertyRef Name="CompanyId" /> 
     </Key> 
     <Property Name="CompanyId" Type="Edm.String" Nullable="false" /> 
     <NavigationProperty Name="Customer" Type="Collection(Test.Customer)" ContainsTarget="true" /> 
     </EntityType> 
     <EntityType Name="Customer"> 
     <Key> 
      <PropertyRef Name="CompanyId" /> 
      <PropertyRef Name="CustNum" /> 
     </Key> 
     <Property Name="CompanyId" Type="Edm.String" Nullable="false" /> 
     <Property Name="CustNum" Type="Edm.Int32" Nullable="false" /> 
     <NavigationProperty Name="Company" Type="Test.Company" Nullable="false"> 
      <ReferentialConstraint Property="CompanyId" ReferencedProperty="CompanyId" /> 
     </NavigationProperty> 
     </EntityType> 
     <EntityContainer Name="DefaultContainer"> 
     <EntitySet Name="Company" EntityType="Test.Company" /> 
     <EntitySet Name="Customer" EntityType="Test.Customer" /> 
     </EntityContainer> 
    </Schema> 
    </edmx:DataServices> 
</edmx:Edmx> 

回答

0

我想通了。我有相反/主要属性颠倒(更正的代码在下面)。其中一个大辩论(几年前)是箭头应该在实体 - 关系模型中指出RI声明的哪一方面(即哪一方是依赖的)。我必须一直处于那个失败的一方。 ;)

var navCompanyCustomer = company.AddUnidirectionalNavigation(
    new EdmNavigationPropertyInfo() 
    { 
     ContainsTarget = true, 
     Name = "Customer", 
     Target = customer, 
     TargetMultiplicity = EdmMultiplicity.Many, 
     DependentProperties = new[] { companyKey1 }, 
     PrincipalProperties = new[] { customerKey1 } 
    });