Joo*_*ost 6 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)
...
Run Code Online (Sandbox Code Playgroud)
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;
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
我在 StackOverflow 上发现了类似的问题:实体框架错误 - 同时数据库读取,但不幸的是这个问题没有得到解答。
谢谢大家,事实证明静态上下文确实是我问题的根本原因。当我们在服务器上执行压力测试时,结果很容易重现,因此多个线程正在使用静态上下文。这将导致与上述相同的错误,以及其他几个错误。
现在,每次调用都会创建上下文,并且错误消失了。