我有一个使用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,但不幸的是,这个问题没有得到答复。
答案 0 :(得分:3)
谢谢大家,结果证明静态上下文确实是我问题的根本原因。当我们在服务器上执行压力测试时,结果很容易重现,因此多个线程正在使用静态上下文。这将导致与上述相同的错误,以及其他一些错误。
现在每次调用都会创建上下文,错误消失了。