You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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参数关联起来,导致启动校验不通过。
修复方案
  1. 调整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;
}
  1. 修改路由映射代码,传入对应版本的带注解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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:09:01