.NET6升级OData 8.2.3后,枚举映射为整数功能失效求助
.NET6 + OData 8.2.3枚举映射失效的解决办法
你遇到的问题核心是OData 8.x系列相对于7.x在模型构建API、枚举处理逻辑上有重大变更,原来的配置方式不再适用,需要调整以下几个点:
1. 替换废弃的StructuralTypeConfiguration API
OData 8.x已经移除了StructuralTypeConfiguration相关的旧API,改用ODataConventionModelBuilder的强类型配置方式。原来的枚举映射代码需要改成:
var modelBuilder = new ODataConventionModelBuilder(); // 注册实体类型 var reportEntity = modelBuilder.EntityType<Report>(); // 显式添加被[NotMapped]标记的ReportStatus属性(OData 8默认忽略NotMapped属性) reportEntity.Property(r => r.ReportStatus); // 保留整数类型的ReportStatusId属性 reportEntity.Property(r => r.ReportStatusId); // 显式注册枚举类型(如果需要全局支持字符串枚举) modelBuilder.EnumType<ReportStatus>();
2. 调整[NotMapped]属性的OData处理逻辑
在OData 8.x中,被EF Core的[NotMapped]标记的属性默认不会被自动加入OData模型,哪怕你之前手动配置过。必须通过EntityType<T>.Property()显式将其加入模型,才能在OData响应中返回该属性。
3. 配置枚举的序列化行为(可选)
如果需要确保ReportStatus始终返回字符串格式,需要在OData服务配置中显式指定枚举序列化规则:
services.AddControllers().AddOData(options => { options.EnableQueryFeatures(100); options.AddRouteComponents("odata", GetEdmModel()) .SetEnumSerializerSettings(new EnumSerializerSettings { EnumFormat = EnumFormat.String // 强制枚举序列化为字符串 }); });
4. 检查EF Core与OData的模型一致性
.NET6的EF Core对[NotMapped]的处理更严格,确保你的ReportStatus属性确实只是在EF中不映射数据库,但在OData模型中被显式包含,两者的配置不能冲突。
内容的提问来源于stack exchange,提问作者Gopi
相关产品推荐
相关产品推荐

