0

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 について理解していることから、これを行う正しい方法はナビゲーション プロパティを変更することだと思いますが、方法や場所がわかりません。

どんな助けでも大歓迎です。前もって感謝します。

乾杯、スティーブ

4

1 に答える 1