EF6导航属性Kind为None而非Navigation的间歇性报错问题
问题场景
- 基于ASP.NET MVC开发Web应用,使用EF6作为ORM框架,数据库包含
User、Band两张SQL表,Band表的UserID字段已与User表的Id字段配置导航关联。 - 应用发布至Azure后偶发抛出异常,提示无法识别两表间的导航链接。
故障触发规律
- 触发路径固定:程序先查询
Band表数据,再检索关联的User表数据时触发 - 无匹配数据时不触发:
Band表无符合查询条件的记录时不会抛出错误 - 仅当查询到有效
Band记录、进一步加载关联的User数据时才会触发异常 - 发作特征:属于间歇性故障,仅在Web应用冷启动阶段触发
版本背景
- 历史正常运行版本:.NET 4.6 + OData 5.8.3
- 出现故障的当前版本:.NET 4.8 + OData 5.8.5
- 初步排查方向:所有线索均指向.NET版本升级或OData包升级为问题诱因,寻找遇到过同类问题的开发者提供解决方案。
核心报错信息
InvalidOperationException: A property with name 'User' on type '########.Band' has kind 'None', but it is expected to be of kind 'Navigation'
完整错误堆栈
Microsoft.Data.OData.ReaderValidationUtils.ValidateNavigationPropertyDefined(String propertyName, IEdmEntityType owningEntityType, ODataMessageReaderSettings messageReaderSettings) +201 Microsoft.Data.OData.Atom.ODataAtomEntryAndFeedDeserializer.TryReadNavigationLinkInEntry(IODataAtomReaderEntryState entryState, String linkRelation, String linkHRef) +151 Microsoft.Data.OData.Atom.ODataAtomEntryAndFeedDeserializer.ReadAtomLinkElementInEntry(IODataAtomReaderEntryState entryState) +214 Microsoft.Data.OData.Atom.ODataAtomEntryAndFeedDeserializer.ReadAtomElementInEntry(IODataAtomReaderEntryState entryState) +367 Microsoft.Data.OData.Atom.ODataAtomEntryAndFeedDeserializer.ReadEntryContent(IODataAtomReaderEntryState entryState) +95 Microsoft.Data.OData.Atom.ODataAtomReader.ReadEntryStart() +697 Microsoft.Data.OData.Atom.ODataAtomReader.ReadAtFeedStartImplementation() +79 Microsoft.Data.OData.ODataReaderCore.ReadImplementation() +56 Microsoft.Data.OData.ODataReaderCore.ReadSynchronously() +5 Microsoft.Data.OData.ODataReaderCore.InterceptException(Func`1 action) +94 Microsoft.Data.OData.ODataReaderCore.Read() +68 System.Data.Services.Client.Materialization.ODataReaderWrapper.Read() +18 System.Data.Services.Client.Materialization.FeedAndEntryMaterializerAdapter.TryRead() +30 [InvalidOperationException: A property with name 'User' on type '########.Band' has kind 'None', but it is expected to be of kind 'Navigation'.] System.Data.Services.Client.Materialization.FeedAndEntryMaterializerAdapter.TryRead() +145 System.Data.Services.Client.Materialization.FeedAndEntryMaterializerAdapter.TryStartReadFeedOrEntry() +13 System.Data.Services.Client.Materialization.FeedAndEntryMaterializerAdapter.TryReadEntry(MaterializerEntry& entry) +15 System.Data.Services.Client.Materialization.<LazyReadEntries>d__0.MoveNext() +41 System.Data.Services.Client.Materialization.FeedAndEntryMaterializerAdapter.Read() +29 System.Data.Services.Client.Materialization.ODataReaderEntityMaterializer.ReadNextFeedOrEntry() +10 System.Data.Services.Client.Materialization.ODataEntityMaterializer.ReadImplementation() +72 System.Data.Services.Client.MaterializeAtom.MoveNextInternal() +348 System.Data.Services.Client.MaterializeAtom.MoveNext() +68 System.Linq.<CastIterator>d__97`1.MoveNext() +85 System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source) +183 System.Data.Services.Client.DataServiceQueryProvider.ReturnSingleton(Expression expression) +305 System.Data.Services.Client.DataServiceQueryProvider.Execute(Expression expression) +70 System.Linq.Queryable.FirstOrDefault(IQueryable`1 source) +211 ActiCheck.IISHandler1.ProcessRequest(HttpContext Context) in C:\Users\############\MsgCoordinator.cs:545 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +813 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +132 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +73
环境信息
- .NET Framework版本:4.0.30319
- ASP.NET版本:4.8.4494.0
- 请求最终返回状态码:
500 Internal Server Error
内容的提问来源于stack exchange,提问作者Alex22T
相关产品推荐
相关产品推荐

