2017-04-17 2 views
0

Ich baue einen OData-Service mit den ODataLib v7.1.1-Bits von Microsoft.OData.Core (et al). Ich habe Probleme mit dem verkürzten Schlüsselprädikat URL-Format mit ODataUriParser.ParsePath(). Die (relative) URL "Firma ('Comp1')/Kunde (1)" löst eine Ausnahme aus "Die Anzahl der im URI angegebenen Schlüssel stimmt nicht mit der Anzahl der Schlüsseleigenschaften für die Ressource 'Test.Customer'" überein.OData verkürzte Schlüsselprädikat-Unterstützung

Das Modell ist sehr einfach und ich kann nicht sehen, warum das nicht funktioniert. Andere Formate für die URLs funktionieren ("Firma ('Comp1')", "Kunde (CompanyId = 'COMP1', CustNum = 1)").

Ich habe den Model Builder-Code unten zusammen mit der $ -Metadatenausgabe angegeben. Jede Hilfe wäre willkommen. Vielen Dank!

-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> 

Antwort

0

ich es herausgefunden. Ich hatte die Abhängigen/Haupteigenschaften umgekehrt (korrigierter Code ist unten). Eine der großen Debatten (vor Jahren) war, auf welche Weise der Pfeil auf eine RI-Deklaration im Entity-Relationship-Modell zeigen sollte (d. H. Welche Seite abhängig ist). Ich muss auf der Verliererseite sein. ;)

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