如何通过 OData 4 和 WebApi 2.2 公开导航 属性?
How do I expose a navigation property over OData 4 and WebApi 2.2?
我在一个模型上有一个导航 属性,Site.Locality
虽然它的外键是序列化的并且可供消费者使用 (Site.LocalityName
),但我希望地点本身是可从:
~/Site('A')/Locality
这是如何在 OData v4 中通过 WebApi 2.2 完成的?
在 Site
实体的控制器上,添加以下操作:
// Implies that the controller has [ODataRoutePrefix("Sites")]
[ODataRoute("({name})/Locality")]
public async Task<Locality> GetLocality([FromODataUri] string name)
{
// Add try-catch or null 404 handling.
var site = await this.Repository.GetAsync(new[] { name });
return site.Locality;
}
显然,将您自己的 DAL 代码放在那里,这只是一个示例。
很明显,这是通过控制器上的简单路由和操作来实现的。
就是说,幕后发生了一些映射。例如,您不能只公开任意导航 属性:
[ODataRoute("({name})/Wangachop")]
public string GetWangachop([FromODataUri] string name)
{
return "Wangaaa!";
}
会产生:
The path template 'Sites({name})/Wangachop' on the action 'GetWangachop' in controller 'Sites' is not a valid OData path template. Found an unresolved path segment 'Wangachop' in the OData path template 'Sites({name})/Wangachop'.
我在一个模型上有一个导航 属性,Site.Locality
虽然它的外键是序列化的并且可供消费者使用 (Site.LocalityName
),但我希望地点本身是可从:
~/Site('A')/Locality
这是如何在 OData v4 中通过 WebApi 2.2 完成的?
在 Site
实体的控制器上,添加以下操作:
// Implies that the controller has [ODataRoutePrefix("Sites")]
[ODataRoute("({name})/Locality")]
public async Task<Locality> GetLocality([FromODataUri] string name)
{
// Add try-catch or null 404 handling.
var site = await this.Repository.GetAsync(new[] { name });
return site.Locality;
}
显然,将您自己的 DAL 代码放在那里,这只是一个示例。
很明显,这是通过控制器上的简单路由和操作来实现的。
就是说,幕后发生了一些映射。例如,您不能只公开任意导航 属性:
[ODataRoute("({name})/Wangachop")]
public string GetWangachop([FromODataUri] string name)
{
return "Wangaaa!";
}
会产生:
The path template 'Sites({name})/Wangachop' on the action 'GetWangachop' in controller 'Sites' is not a valid OData path template. Found an unresolved path segment 'Wangachop' in the OData path template 'Sites({name})/Wangachop'.