我有很多不同的实体想要为其启用 OData。这些实体根据其类型分为不同的组。目前,默认设置是将 EntitySet 与控制器名称相匹配,但我不希望为我拥有的每个实体类型都有一个控制器。有没有一种方法可以将多个 EntitySet 映射到一个控制器。
我尝试让我感兴趣的类型实现一个通用接口,并将该接口指定为我的实体集类型。我还尝试在一个控制器中拥有两个实体并使用它们自己的获取请求,但没有运气。我还尝试定义自己的扩展 EntitySetRoutingConvention 的路由类,但还没有发挥作用。
WebApi配置
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<MyEntity1>("MyEntity1");
builder.EntitySet<MyEntity2>("MyEntity2");
config.Routes.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
// Web API routes
config.MapHttpAttributeRoutes();
}
这将查找名为 MyEntity1Controller 和 MyEntity2Controller 的控制器。
我想要的是这样的:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<MyEntity1>("Generic");
builder.EntitySet<MyEntity2>("Generic"); // Throws an error since Generic is already registered to MyEntity1
config.Routes.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
// Web API routes
config.MapHttpAttributeRoutes();
}
通用控制器.cs
// GET: odata/myentity1
[EnableQuery]
public IQueryable<MyEntity1> GetMyEntity1()
{
return db.MyEntity1.AsQueryable();
}
// GET: odata/myentity2
[EnableQuery]
public IQueryable<myentity2> GetMyEntity2()
{
return db.MyEntity2.AsQueryable();
}
预期结果是我可以转到 myurl/Generic/MyEntity1 ,这将在我的通用控制器中触发 GET 请求。我还应该能够执行 odata 操作,例如 myurl/Generic/MyEntity1?$select=Id。