ナビゲーション プロパティを生成するとき、関係を再利用しません。
たとえば、単純なモデルがあるとします。
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" />
1 つではなく 2 つの関係を生成していることに注意してください。これを行う理由は、2 つのナビゲーション プロパティが同じ関係を表しているかどうかを判断するのが難しい問題だからです。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 がエンティティ フレームワークと同じ EDM モデルを使用するために発生します。Entityframework は、これらの関係をデータベース内のテーブルになる関連付けセットにマップするときに、この情報を必要とします。
これを行わないことを選択したもう 1 つの理由は、これが OData V4 でなくなる可能性があるためです。ここで作業草案を確認してください (23 ページと 57 ページが興味深いでしょう)。つまり、OData V4 の $metadata のナビゲーション プロパティは、次のようになります。
<NavigationProperty Name="Category" Type="Self.Category" Nullable="false" Partner="Products" />
リレーションシップはなく、アソシエーション セットも存在しないことに注意してください。