2015-08-11 2 views
2

У меня есть служба ASP.NET MVC, которая использует EntityFramework. Служба работает правильно, и почти все запросы к базе данных успешны. Однако несколько раз в день запрос в базе данных генерирует исключение NullReferenceException. Это стоп-трасса:EntityFramework throws 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

Возможно ли, что IQueryable, к которому применяется вызов Max(), может быть пустым (но не нулевым) набором? Потому что это заставило бы EF выбрасывать подгонку, поскольку максимальное значение пустого набора не поддается определению. –

+0

Набор данных довольно статичен, и когда я повторяю неудачный запрос сейчас, он преуспевает. Поэтому я не думаю, что набор результатов, к которому применяется Макс, пуст. Кроме того, когда я намеренно выполняю Max-запрос на пустом наборе результатов, я получаю другую ошибку. – Joost

+5

Синглтонский контекст .. Не хорошо !!! – vendettamit

ответ

2

Спасибо, ребята, оказывается, что статический контекст действительно был основной причиной моей проблемы. Это оказалось довольно легко воспроизвести, когда мы проводим стресс-тест на нашем сервере, так что несколько потоков используют статический контекст. Это приведет к такой же ошибке, как описано выше, а также к ряду других ошибок.

Контекст теперь создается за звонок, и ошибки исчезли.

Смежные вопросы