【问题标题】:WebAPI OData and customizing navigation linksWebAPI OData 和自定义导航链接
【发布时间】:2013-07-23 09:47:36
【问题描述】:

我正在构建基于 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 实例的 ID 为“2”)。

我知道我可以将“OtherEntity”的类型设置为 Uri 并在我的控制器中插入适当的值,但这似乎有点 hack(但我可能错了)。根据对 OData 的了解,我认为正确的方法是修改导航属性,但我不确定如何或在哪里。

感谢任何帮助。提前致谢。

干杯, 史蒂夫

【问题讨论】:

    标签: asp.net asp.net-web-api odata


    【解决方案1】:

    您可以执行以下操作:

            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);
    

    【讨论】:

    • 这就像一个魅力,感谢您的帮助。作为奖励,我现在也看到了 JSON 光输出中的链接(我认为这是因为“followsConventions: false”声明)。
    猜你喜欢
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 2015-08-02
    • 2013-06-27
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多