У меня есть служба 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, но, к сожалению, этот вопрос остается без ответа.
Возможно ли, что IQueryable, к которому применяется вызов Max(), может быть пустым (но не нулевым) набором? Потому что это заставило бы EF выбрасывать подгонку, поскольку максимальное значение пустого набора не поддается определению. –
Набор данных довольно статичен, и когда я повторяю неудачный запрос сейчас, он преуспевает. Поэтому я не думаю, что набор результатов, к которому применяется Макс, пуст. Кроме того, когда я намеренно выполняю Max-запрос на пустом наборе результатов, я получаю другую ошибку. – Joost
Синглтонский контекст .. Не хорошо !!! – vendettamit