调试EF导航属性会产生“ExecuteReader需要以及打开和可用的连接。连接的当前状态已关闭。”

时间:2016-05-18 16:10:27

标签: entity-framework debugging

当您正在调试和具有由于延迟加载而未加载导航属性的EF实体时,您通常会在调试器窗口中看到类似的内容:

The function evaluation requires all threads to run

然后当你点击小线程图标时,它通过执行对数据库的查询来评估这个,你会得到这样的结果:

Navigation Property Expanded

当您尝试评估该属性时,偶尔会出现异常:

Exception when navigating property

完整堆栈跟踪:

ExecuteReader需要并打开且可用的连接。连接的当前状态已关闭。 at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior behavior)\ r \ n在System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType](ObjectContext context, System.Data.Entity.Core.Objects中的System.Data.Entity.Core.Objects.ObjectQuery 1.<>c__DisplayClass7.<GetResults>b__6()\r\n at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func 1 func,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction,Boolean releaseConnectionOnSuccess)\ r \ n的ObjectParameterCollection parameterValues)\ r \ n .ObjectQuery 1.<>c__DisplayClass7.<GetResults>b__5()\r\n at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func 1操作)\ r \ n在System.Data.Entity.Core.Objects.ObjectQuery 1.GetResults(Nullable 1 forMergeOption)\ r \ n在System.Data.Entity.Core.Objects.ObjectQuery 1.Execute(MergeOption mergeOption)\r\n at System.Data.Entity.Core.Objects.DataClasses.EntityReference 1.在System.Data.Entity.Core.Objects.DataClasses的System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.Load()\ r \ n中加载(MergeOption mergeOption)\ r \ n System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior.LoadProperty [TItem]中的.RelatedEnd.DeferredLoad()\ r \ n(TItem propertyValue,String relationshipName, String targetRoleName,Boolean mustBeNull,Object wrapperObject)\ r \ n在System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior。&lt;&gt; c__DisplayClass7`2.b__2(TProxy proxy,TItem item)\ r \ n在System .Data.Entity.DynamicProxies.NameOfProperty_819B7CF59ACBFAC0FE367DDDFF9720DFDEDAB294A8AEAD37D4460065346EAF5F.get_LatestVersion()

注意:

- 仅在调试和导航属性展开时才会出现此问题。在正常的代码执行或生产环境下,问题永远不会发生

- 在所有版本的EF 6.0.x中都可以找到问题,直到最新的6.1.3

- 所有开发人员都将这个问题报告为近期历史中已经出现的问题,尽管由于各种不同的Windows 8,10,Visual Studio 2013,2015的各种配置都会出现问题而无法找到模式。更新

- 一旦发生错误,任何对EF上下文的访问都会受到错误的阻碍

- 在调试会话的前几个HTTP请求期间可能不会发生错误

- 错误与DI容器无关,因为在Unity,Autofac上看到错误,并且没有为EF上下文实现任何DI

- 实现拦截器似乎改变了底层代码路径,因此不会发生错误

解决方法:

实现拦截器可以防止错误发生。最简单的方法是使用EF Logging拦截器(Database.Log)。这可以在Entity Context的构造函数中设置,可以通过传入一个空的func来完成。我们将它包装在“#if..debug”中,以确保它只在调试本地环境中执行以保存性能:

public EntityContext()
{
   #if DEBUG
        Database.Log = s => { };
   #endif
}

0 个答案:

没有答案