0

我正在构建基于 WebAPI 的 OData 服务,但我遇到了导航链接问题。基本上我有两个类,其中一个引用另一个。当我请求原子或详细 JSON 时,我可以看到两者之间存在链接。但是,我想自定义 uri 以使其指向不同的位置,而不是 OData 库假定的默认位置。

使用一个简单的示例,假设我有两个实体集,分别称为“entity1”和“entity2”。这些作为 OData 服务公开,分别位于:/api/entities1 和 /api/entities2。

这是我的示例模型代码:

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 并在我的控制器中插入适当的值,但这似乎有点 hack(但我可能是错的)。根据对 OData 的了解,我认为正确的方法是修改导航属性,但我不确定如何或在哪里。

任何帮助表示赞赏。提前致谢。

干杯,史蒂夫

4

1 回答 1

2

您可以执行以下操作:

        var entities1 = builder.EntitySet<Entity1>("Entities1");
        entities1.HasNavigationPropertyLink(entities1.EntityType.NavigationProperties.First(np => np.Name == "OtherEntity"),
            (context, navigation) =>
            {
                return new Uri(context.Url.ODataLink(new EntitySetPathSegment("Entities2"), new KeyValuePathSegment(context.EntityInstance.OtherEntity.Id.ToString())));
            }, followsConventions: false);
于 2013-07-24T18:15:02.127 回答