【问题标题】:OData Shortened Key Predicate SupportOData 缩短键谓词支持
【发布时间】:2017-04-19 00:55:04
【问题描述】:

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

模型非常简单,我不明白为什么它不起作用。 URL 的其他格式也有效(“Company('Comp1')”、“Customer(CompanyId='COMP1',CustNum=1)”)。

我已将模型构建器代码与 $metadata 输出放在下面。任何帮助,将不胜感激。谢谢!

-埃里克

    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>

【问题讨论】:

    标签: odata odatalib


    【解决方案1】:

    我想通了。我将 Dependent / Principal 属性颠倒了(更正的代码如下)。 (几年前)最大的争论之一是箭头应该指向实体关系模型中的 RI 声明的方向(即哪一方是依赖的)。我一定是那个失败的一方。 ;)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-06
      • 2012-12-24
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 2013-03-20
      相关资源
      最近更新 更多