.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
相关产品推荐
相关产品推荐

