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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:30:03