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

ASP.NET Core OData 8.2.5报错:找不到MyClass的keyName属性

ASP.NET Core OData 8.2.5 属性查找异常解决

问题概述

受影响程序集:ASP.NET Core OData 8.2.5
升级至8.2.5版本后触发以下异常:

Could not find a property named 'keyName' on type 'MyClass'
该功能在ASP.NET Core OData 8.2.4及之前版本可正常运行,异常触发代码行:

(int)oDataQueryOptions.Count?.GetEntityCount(oDataQueryOptions.Filter?.ApplyTo(myClassQuery, new ODataQuerySettings()) ?? myClassQuery)

重现步骤

  • 创建指定C# Web API及实体类
  • 调用API:https://localhost:8080/api/requests?$format=json&$top=10&$orderby=keyName&$count=true
    即可触发异常。

相关代码

实体类

public class MyClass
{
    [Key]
    public int AutoId { get; set; }
    public string KeyName { get; set; }
    public string Description { get; set; }
}

Web API代码

public Task GetMyClassData(ODataQueryOptions oDataQueryOptions)
{
    var myClassQuery = dbContext.Table1
                                .GetAll()
                                .Select(t => new MyClass
                                             {
                                                 AutoId = t.Autoid,
                                                 KeyName = t.KeyName,
                                                 Description = t.Description,
                                             });

    var response = new
                   {
                       totalRecords = (int)oDataQueryOptions.Count?.GetEntityCount(oDataQueryOptions.Filter?.ApplyTo(myClassQuery, new ODataQuerySettings()) ?? myClassQuery),
                       records = oDataQueryOptions.ApplyTo(myClassQuery).Cast()
                   };
}

问题原因

ASP.NET Core OData 8.2.5版本在属性名称匹配上引入了更严格的大小写校验机制。实体类中属性名为KeyName(驼峰命名,首字母大写),但请求URL的$orderby参数使用的是keyName(首字母小写),新版本不再自动兼容这种大小写差异,导致无法找到对应属性。

解决方案

方案1:调整请求参数的属性名

将请求URL中的$orderby=keyName改为$orderby=KeyName,与实体类的属性名保持完全一致:

https://localhost:8080/api/requests?$format=json&$top=10&$orderby=KeyName&$count=true

方案2:配置OData支持大小写不敏感的属性匹配

在OData模型配置时,添加自定义命名约定,让OData忽略属性名称的大小写差异:

using Microsoft.OData.ModelBuilder;

public IEdmModel GetEdmModel()
{
    var builder = new ODataConventionModelBuilder();
    // 启用驼峰命名映射,自动匹配请求中的小写开头属性名
    builder.EnableLowerCamelCase();
    builder.EntitySet<MyClass>("requests");
    return builder.GetEdmModel();
}

若需要更灵活的处理,也可以自定义INamingConvention实现大小写不敏感的属性映射逻辑。

方案3:修正API代码中的Cast方法

原代码中Cast()未指定泛型类型,可能导致OData无法正确识别实体类型,改为Cast<MyClass>():

records = oDataQueryOptions.ApplyTo(myClassQuery).Cast<MyClass>()

方案4:检查OData模型注册

确保在Startup/Program.cs中正确注册了MyClass的OData模型,没有遗漏属性配置或实体集注册。

内容的提问来源于stack exchange,提问作者Abhinav Verma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:27:25