当我们生成导航属性时,我们不会重用关系。
例如,假设您有一个简单的模型,
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; }
}
这不是一件简单的事情,要想明白Maufacturer.RawMaterials和Product.Consumers应该共享同样的关系以及Manufaturer.Produces和Product.Producers应该共享同样的关系。我们选择不这样做是因为我们所知道的客户并没有从这些信息中获得太多收益。
所有这些都发生在OData使用与entityframework相同的EDM模型时。Entityframework需要此信息,因为它将这些关系映射到关联集,这些关联集将变成数据库中的表。
我们选择不这样做的另一个原因是,在OData V4中,这可能会消失。请查看工作草案
此处(第23页和第57页将是有意思的)。简而言之,在OData V4中,$metadata中的导航属性将更像这样。
<NavigationProperty Name="Category" Type="Self.Category" Nullable="false" Partner="Products" />
请注意,这里没有关系,也不会有关联集。