EntityFramework抛出NullReferenceException

时间:2015-08-11 12:49:35

标签: c# asp.net asp.net-mvc entity-framework

我有一个使用EntityFramework的ASP.NET MVC服务。该服务正常运行,几乎所有对数据库的查询都是成功的。但是,一天几次对数据库的查询会抛出NullReferenceException。这是堆栈跟踪:

at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)
at System.Data.EntityClient.EntityConnection.Open()
at System.Data.Objects.ObjectContext.EnsureConnection()
at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
at System.Linq.Queryable.Max[TSource](IQueryable`1 source)
...

Max()调用是我们自己的代码。

我们没有用于创建数据库连接的特殊代码,除了从DbContext派生的类(用作单例):

public class MyContext : DbContext
{
   /// Singleton instance
   private static MyContext _instance;

   /// Static constructor
   static MyContext()
   {
      Database.SetInitializer<MyContext>( null );
   }

   /// Singleton constructor.
   private MyContext() : base( "Name=MyContext" )
   {
   }

   /// Singleton Instance Property
   public static MyContext Instance
   {
      get
      {
         if( null == _instance ) {
           _instance = new MyContext();
         }
         return _instance;
      }
   }

   ...
}

我在StackOverflow上发现了一个类似的问题:entity framework error - simultaneous db reads,但不幸的是,这个问题没有得到答复。

1 个答案:

答案 0 :(得分:3)

谢谢大家,结果证明静态上下文确实是我问题的根本原因。当我们在服务器上执行压力测试时,结果很容易重现,因此多个线程正在使用静态上下文。这将导致与上述相同的错误,以及其他一些错误。

现在每次调用都会创建上下文,错误消失了。