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

.NET Core 6迁移后使用ODataConventionModelBuilder.GetEdmModel时出现实体类型配置冲突错误

.NET Core 6迁移后使用ODataConventionModelBuilder.GetEdmModel时出现实体类型配置冲突错误

我之前碰到过类似的问题,这大概率是新版本OData模型构建器的自动约定规则和旧版本差异导致的——它在扫描实体类型时,不小心把System.Attribute这类元数据类型也纳入了处理范围,进而引发了类型配置冲突。下面给你几个可行的解决思路:


1. 手动指定实体属性,关闭自动扫描

ODataConventionModelBuilder默认会递归扫描实体类型的所有关联类型(包括属性上的特性),我们可以手动配置实体的属性,避免它去处理那些不需要的元数据类型。修改你的代码如下:

private static ODataQueryOptions CreateDynamicQueryOptions(ODataQueryOptions<DynamicPoco> originalQuery, Type entityType)
{
    var builder = new ODataConventionModelBuilder();
    var entityTypeConfiguration = builder.AddEntityType(entityType);
    
    // 手动添加实体的所有公开实例属性,跳过自动扫描逻辑
    foreach (var prop in entityType.GetProperties(BindingFlags.Public | BindingFlags.Instance))
    {
        entityTypeConfiguration.Property(prop.PropertyType, prop.Name);
    }
    
    var entitySetConfiguration = builder.AddEntitySet(entityType.Name, entityTypeConfiguration);
    var edmModel = builder.GetEdmModel();
    
    var queryContext = new ODataQueryContext(edmModel, entityType, originalQuery.Context.Path);
    return new ODataQueryOptions(queryContext, originalQuery.Request);
}

2. 显式忽略冲突的类型

直接告诉模型构建器不要处理System.Attribute及其派生类,这样就能避免类型配置冲突:

private static ODataQueryOptions CreateDynamicQueryOptions(ODataQueryOptions<DynamicPoco> originalQuery, Type entityType)
{
    var builder = new ODataConventionModelBuilder();
    
    // 忽略Attribute相关类型,阻止模型构建器处理它们
    builder.Ignore(typeof(System.Attribute));
    builder.Ignore(typeof(Newtonsoft.Json.JsonContainerAttribute));
    
    var entityTypeConfiguration = builder.AddEntityType(entityType);
    var entitySetConfiguration = builder.AddEntitySet(entityType.Name, entityTypeConfiguration);
    
    var edmModel = builder.GetEdmModel();
    var queryContext = new ODataQueryContext(edmModel, entityType, originalQuery.Context.Path);
    
    return new ODataQueryOptions(queryContext, originalQuery.Request);
}

3. 检查版本兼容性

注意到你使用的Microsoft.Data.OData是5.8.5,而Microsoft.AspNetCore.OData是8.2.3,这两个版本跨度很大,很可能存在兼容性问题。建议把Microsoft.Data.OData升级到和AspNetCore.OData匹配的8.x版本,这样能减少很多因版本不兼容导致的奇怪问题。


简单说下问题根源:新版本的OData模型构建器自动约定逻辑更“激进”,会扫描实体属性的元数据(比如属性上的Json特性),结果把System.Attribute基类和它的派生类(比如JsonContainerAttribute)同时纳入了配置,一个被识别为复杂类型,一个被识别为实体类型,就触发了冲突。上面的方法都能从不同角度解决这个问题,你可以先试试第一种或者第二种,再考虑版本升级的事。

备注:内容来源于stack exchange,提问作者rashfmnb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 10:23:14