我正在构建基于 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 的了解,我认为正确的方法是修改导航属性,但我不确定如何或在哪里。
任何帮助表示赞赏。提前致谢。
干杯,史蒂夫