我有一个使用 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 ,但不幸的是,这个问题没有答案。
最佳答案
谢谢大家,事实证明静态上下文确实是我问题的根本原因。当我们在服务器上执行压力测试时,结果证明它很容易重现,因此多个线程正在使用静态上下文。这将导致与上述相同的错误,以及其他几个错误。
现在每次调用都会创建上下文,并且错误消失了。
关于c# - EntityFramework 抛出 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31942293/