WebAPI ベースの OData サービスの構築に取り組んでいますが、ナビゲーション リンクに問題があります。基本的に、一方が他方への参照を持つ 2 つのクラスがあります。atom または verbose JSON のいずれかを要求すると、2 つの間にリンクがあることがわかります。ただし、URI をカスタマイズして、OData ライブラリによって想定される既定の場所ではなく、別の場所を指すようにしたいと考えています。
簡単な例を使用して、'entity1' と 'entity2' という 2 つのエンティティ セットがあるとします。これらは、それぞれ /api/entities1 および /api/entities2 にある OData サービスとして公開されます。
これが私のサンプルモデルコードです:
public class Entity1 {
public int ID { get; set; }
public string Name { get; set; }
public virtual Entity2 OtherEntity { get; set; }
}
public class Entity2 {
public int ID { get; set; }
public string Value { get; set; }
}
次のように、ODataConventionModelBuilder を使用してこれらを登録しています。
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Entity1>("entities1");
builder.EntitySet<Entity2>("entities2");
IEdmModel model = builder.GetEdmModel();
config.Routes.MapODataRoute(routeName: "OData", routePrefix: "api", model: model);
コントローラーを EntitySetController として実装しました。これはすべて期待どおりに機能し、詳細な JSON を要求すると、次の応答が返されます。
{
"d": {
"results": [{
"__metadata": {
"id": "http://localhost:37826/api/entities1(1)",
"uri": "http://localhost:37826/api/entities1(1)",
"type": "ODataSample.Models.Entity1"
},
"OtherEntity": {
"__deferred": {
"uri": "http://localhost:37826/api/entities1(1)/OtherEntity"
}
},
"ID": 1,
"Name": "First Entity"
}]
}
}
私がやりたいのは、Entity1 インスタンスの「OtherEntity」フィールドが /api/entities2 の下の関連する Entity2 インスタンスを参照するようにして、リンクが /api/entities2(2) のように表示されるようにすることです ( Entity2 インスタンスは「2」です)。
「OtherEntity」のタイプを Uri にして、コントローラーに適切な値を挿入するだけでよいことはわかっていますが、それは少しハックのように思えます (ただし、間違っている可能性があります)。OData について理解していることから、これを行う正しい方法はナビゲーション プロパティを変更することだと思いますが、方法や場所がわかりません。
どんな助けでも大歓迎です。前もって感謝します。
乾杯、スティーブ