OData:更改 EDM 模型中实体类型的 URL 值
OData: Change URL value for entity type in EDM Model
我正在使用 ASP.NET Core Web Api 项目,该项目将 OData 用于公开的端点并使用 Simple.OData.Client。
我的一些端点是:
http://{baseUrl}/odata/Vehicle
--> 这非常有效
但我对这两个问题有疑问:
http://{baseUrl}/odata/Vehicle/Brand
http://{baseUrl}/odata/Vehicle/Type
基本上,我无法修改我的 EDM 模型来修改 OData 元数据中公开的 URL 属性。我的 EDM 看起来像这样:
private IEdmModel GetEdmModel()
{
var odataBuilder = new ODataConventionModelBuilder();
odataBuilder.EntitySet<Vehicle>("Vehicle");
odataBuilder.EntitySet<VehicleType>("VehicleType");
odataBuilder.EntitySet<VehicleBrand>("VehicleBrand");
return odataBuilder.GetEdmModel();
}
我在浏览 http://{baseUrl}/odata/
时获得的元数据如下:
{
"@odata.context": "https://localhost:44332/odata/$metadata",
"value": [
{
"name": "Vehicle",
"kind": "EntitySet",
"url": "Vehicle"
},
{
"name": "VehicleType",
"kind": "EntitySet",
"url": "VehicleType"
},
{
"name": "VehicleBrand",
"kind": "EntitySet",
"url": "VehicleBrand"
}
]
}
我找不到保持名称原样的方法,但修改 JSON 上显示的 "url" 属性 以指向我的正确端点。我想要这个结果:
{
"name": "VehicleBrand",
"kind": "EntitySet",
"url": "Vehicle/Brand"
}
EntitySetConfiguration
或 ODataConventionModelBuilder
上公开的任何方法似乎都可以为已注册的实体类型指定不同的 URI。
有人遇到过这个问题吗?我确定这可能是解决此问题的某种方式。
Odata 路线或导航属性?
请查看该文档here
长话短说 - OData URI 包括:
- 服务根目录
- OData 路径
- 查询选项
例如。这是一个指向 EntitySet "Products" 的路径,首先获取,然后导航(请参阅导航属性)到其供应商。
https://example.com/odata/Products(1)/Supplier?$top=2
------------base---------|-----Path-----------?---options---
因此,您在根级别访问的所有内容都应该有自己的路径,并且 / 告诉 Odata 从那里继续导航。
所以,现在对于 OData,如果您将实体集路径定义为可能与另一个实体集导航混淆的东西,它会让大多数客户感到震惊,并且肯定是糟糕的风格 属性。
但是如果你真的需要这样做,也许你可以通过定义一个custom routing convention来实现它。
但是不要!只会惹事
你要导航吗属性?
如果您希望 "Type" returns 的集合依赖于 Vehicle,您应该在 Vehicle 上定义导航 属性。
你好,迈克
我正在使用 ASP.NET Core Web Api 项目,该项目将 OData 用于公开的端点并使用 Simple.OData.Client。
我的一些端点是:
http://{baseUrl}/odata/Vehicle
--> 这非常有效
但我对这两个问题有疑问:
http://{baseUrl}/odata/Vehicle/Brand
http://{baseUrl}/odata/Vehicle/Type
基本上,我无法修改我的 EDM 模型来修改 OData 元数据中公开的 URL 属性。我的 EDM 看起来像这样:
private IEdmModel GetEdmModel()
{
var odataBuilder = new ODataConventionModelBuilder();
odataBuilder.EntitySet<Vehicle>("Vehicle");
odataBuilder.EntitySet<VehicleType>("VehicleType");
odataBuilder.EntitySet<VehicleBrand>("VehicleBrand");
return odataBuilder.GetEdmModel();
}
我在浏览 http://{baseUrl}/odata/
时获得的元数据如下:
{
"@odata.context": "https://localhost:44332/odata/$metadata",
"value": [
{
"name": "Vehicle",
"kind": "EntitySet",
"url": "Vehicle"
},
{
"name": "VehicleType",
"kind": "EntitySet",
"url": "VehicleType"
},
{
"name": "VehicleBrand",
"kind": "EntitySet",
"url": "VehicleBrand"
}
]
}
我找不到保持名称原样的方法,但修改 JSON 上显示的 "url" 属性 以指向我的正确端点。我想要这个结果:
{
"name": "VehicleBrand",
"kind": "EntitySet",
"url": "Vehicle/Brand"
}
EntitySetConfiguration
或 ODataConventionModelBuilder
上公开的任何方法似乎都可以为已注册的实体类型指定不同的 URI。
有人遇到过这个问题吗?我确定这可能是解决此问题的某种方式。
Odata 路线或导航属性?
请查看该文档here
长话短说 - OData URI 包括:
- 服务根目录
- OData 路径
- 查询选项
例如。这是一个指向 EntitySet "Products" 的路径,首先获取,然后导航(请参阅导航属性)到其供应商。
https://example.com/odata/Products(1)/Supplier?$top=2
------------base---------|-----Path-----------?---options---
因此,您在根级别访问的所有内容都应该有自己的路径,并且 / 告诉 Odata 从那里继续导航。
所以,现在对于 OData,如果您将实体集路径定义为可能与另一个实体集导航混淆的东西,它会让大多数客户感到震惊,并且肯定是糟糕的风格 属性。
但是如果你真的需要这样做,也许你可以通过定义一个custom routing convention来实现它。
但是不要!只会惹事
你要导航吗属性?
如果您希望 "Type" returns 的集合依赖于 Vehicle,您应该在 Vehicle 上定义导航 属性。
你好,迈克