.NET Core 3.1 OData API版本化启动异常:EDM缺少ApiVersionAnnotation注解
问题原因分析
该报错的核心是你生成的IEdmModel实体模型没有绑定OData版本化要求的API版本注解,直接传入无注解的裸EDM模型时,版本化OData中间件无法识别该EDM对应的API版本,触发校验失败。具体根因如下:
MapVersionedODataRoute方法要求传入的每个IEdmModel实例都必须预先附加ApiVersionAnnotation注解,用来标记该EDM对应的API版本,你当前BuildEdmModel方法生成的EDM没有添加该注解,直接传入就会触发报错。- 即使你已经在DI容器中注册了所有API版本化相关服务,路由映射阶段也没法将无注解的EDM和路由模板里的
apiVersion参数关联起来,导致启动校验不通过。
修复方案
- 调整
BuildEdmModel方法,生成EDM之后附加对应版本的注解,示例代码如下:
using Microsoft.AspNetCore.OData.Versioning; using Microsoft.OData.Edm; private static IEdmModel BuildEdmModel(ApiVersion targetVersion) { var builder = new ODataConventionModelBuilder(); // 保留你原有的EDM构建逻辑,比如添加实体集、配置实体关系等 // builder.EntitySet<Payment>("Payments"); var edmModel = builder.GetEdmModel(); // 给EDM附加必填的API版本注解 edmModel.SetAnnotationValue(edmModel, new ApiVersionAnnotation(targetVersion)); return edmModel; }
- 修改路由映射代码,传入对应版本的带注解EDM:
public static IEndpointRouteBuilder MapPaymentsODataRoute(this IEndpointRouteBuilder builder) { builder.MapVersionedODataRoute( "payments-odata", "api/v{apiVersion:apiVersion}/payment-service/odata", // 如果支持多版本,就把每个版本对应的带注解EDM都加入该列表 new List<IEdmModel> { BuildEdmModel(new ApiVersion(1,0)) }); return builder; }
注意事项
- 如果服务支持多API版本,每个版本对应的EDM都要单独生成并附加对应版本的
ApiVersionAnnotation,再统一放到传入的List<IEdmModel>中。 - 不要复用同一个EDM实例给多个API版本,每个版本的EDM要独立生成并附加对应注解。
内容的提问来源于stack exchange,提问作者vaskiv99
相关产品推荐
相关产品推荐

