在asp.net webapi odata $metadata中缺少逆属性



两个实体之间有非常简单的关系,我试图用asp.net webapi odata控制器暴露它们,但似乎$元数据有问题。

当我在$metadata上运行jaydatasvcutil.exe时,我得到警告:inverseProperty另一侧丢失。

当我使用breezejs loadNavigationProperty时,我得到类似的错误。

即使是官方的例子我也有问题。http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/working-with-entity-relations

您可以在这里观察$metadata http://sdrv.ms/Z5Klfw

请帮。

当我们生成导航属性时,我们不会重用这些关系。

例如,假设你有一个简单的模型,

public class Product
{
    public int Id { get; set; }
    public Supplier Supplier { get; set; }
}
public class Supplier
{
    public int Id { get; set; }
    public Product[] Products { get; set; }
}

我们生成的导航属性的$metadata看起来像这样,

<NavigationProperty Name="Supplier" Relationship="ProductsService.Models.ProductsService_Models_Product_Supplier_ProductsService_Models_Supplier_SupplierPartner" ToRole="Supplier" FromRole="SupplierPartner" />
<NavigationProperty Name="Products" Relationship="ProductsService.Models.ProductsService_Models_Supplier_Products_ProductsService_Models_Product_ProductsPartner" ToRole="Products" FromRole="ProductsPartner" />

注意,我们正在生成两个关系而不是一个关系。我们这样做的原因是很难弄清楚两个导航属性是否表示相同的关系。以Product和Manufacturer为例。

public class Manufacturer
{
    public int Id { get; set; }
    public Product[] RawMaterials { get; set; }
    public Product[] Produces { get; set; }
}
public class Product
{
    public int Id { get; set; }
    public Manufacturer[] Producers { get; set; }
    public Manufacturer[] Consumers { get; set; }
}

找出那个制造商不是件容易的事。原材料和产品。消费者应该和制造商建立同样的关系。生产者和产品。制作人也应该拥有同样的关系。我们选择不这样做,因为我们所知道的客户并没有从这些信息中得到很多。

这一切的发生是因为OData使用与实体框架相同的EDM模型。Entityframework需要这些信息,因为它将这些关系映射到将成为数据库中的表的关联集。

我们选择不这样做的另一个原因是,这可能会在OData V4中消失。请在这里查看工作草案(第23页和第57页将令人感兴趣)。简而言之,OData V4中$metadata中的导航属性看起来更像这样,

<NavigationProperty Name="Category" Type="Self.Category" Nullable="false" Partner="Products" />

注意这里没有关系,也没有关联集

相关内容

  • 没有找到相关文章

最新更新