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

时间:2013-04-05 07:52:51

标签: asp.net-web-api odata breeze jaydata

两个实体之间的关系非常简单,我试图用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

您可以在此处观察$元数据http://sdrv.ms/Z5Klfw

请帮忙。

1 个答案:

答案 0 :(得分:7)

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

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

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

我们生成的导航属性的$元数据如下所示

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

请注意,我们正在生成两个关系,而不是一个。我们这样做的原因是,弄清楚两个导航属性是否代表相同的关系是一个难题。以产品和制造商为例。

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

要弄清楚Maufacturer.RawMaterials和Product.Consumers应该共享相同的关系并且Manufaturer.Produces和Product.Producers应该共享相同的关系并非易事。我们选择不这样做是因为我们所知道的客户并没有从这些信息中获取太多信息。

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

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

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

请注意,没有关系,也没有关联集。