Я использую Entity Framework 6 с Oracle.ManagedDataAccess. Иногда я получаю эту ошибку:
System.NullReferenceException: Object reference not set to an instance of an object.
at Oracle.ManagedDataAccess.Client.OracleConnection.get_m_majorVersion()
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior)
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext)
at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__5()
at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
at System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0()
at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
at MyApp.MyScheduler.AddSampleOperation(SampleOperation sampleOperation)
Это происходит именно тогда, когда я звоню, например:
_dbContext.SampleOperations.AsNoTracking().First(so => so.SampleOperationId == sampleOperation.SampleOperationId);
Чтобы было ясно, это не исключение NullReferenceException, происходящее с кодом, который я контролирую. Это происходит в клиентском коде Oracle, и это случается только спорадически. Я могу воспроизвести одни и те же шаги несколько раз, и ошибки не произойдет, а затем, в конце концов, это произойдет. Я попытался удалить Oracle.ManagedDataAccess.Client из GAC, но это не помогло.
Я надеюсь, что кто-то еще видел эту ошибку. Я использую следующие версии NuGet:
Oracle.ManagedDataAccess: 12.1.24160719
Oracle.ManagedDataAccess.EntityFramework: 12.1.2400
EntityFramework: 6.1.3
Может быть, что-то было исправлено в более поздней версии Oracle.ManagedDataAccess?
Теперь вы можете получить драйверы Oracle из NuGet nuget.org/packages/Oracle.ManagedDataAccess, так что попробуйте. А также убедитесь, что вы не обращаетесь к экземпляру DbContext из нескольких потоков, что может вызвать спорадические сбои с любым поставщиком.
Собираюсь попробовать обновиться до 12.2. Вопрос @ DavidBrowne-Microsoft: если весь доступ к DbContext всегда заключен в блокировку, предотвратит ли это спорадические сбои?
да. Доступ к DbContext можно получить из разных потоков, но не одновременно. Хотя для производительности вы обычно этого не делаете.
Я также периодически получаю эту ошибку, и мне не везет ни с чем, что я пытаюсь. Вы нашли какое-нибудь исправление?
Я обновил Oracle.ManagedDataAccess через NuGet. Я больше не видел эту ошибку, но она была спорадической, поэтому я не уверен на 100%, что она исправлена.
На прошлой неделе я фактически обновил Oracle.ManagedDataAccess и Oracle.ManagedDataAccess.EntityFramework до версии 18.3.0. Никаких ошибок до сегодняшнего дня :( Снова та же ошибка. Похоже, это ситуационная (IE: обрабатываются сотни записей, затем все записи в течение 3 или 4 минут получают эту ошибку, затем обрабатываются другие записи).
@AndyArndt, можешь дать мне знать, если еще что-нибудь придумаешь? Я тоже дам тебе знать. Спасибо!
Я открыл обращение в службу поддержки Oracle, чтобы посмотреть, могут ли они хотя бы указать нам правильное направление для поиска проблемы. Я обновлю то, что узнаю.
Я нашел место, где возможен доступ к контексту db из отдельного потока без блокировки. На самом деле это может быть основной причиной этого. Вы можете поискать это в своем коде.
Мое решение вроде как грустное. В нашем сервисе мы использовали структуру CQRS. Все наши ошибки этого типа, казалось, были вызваны вызовами, которые эта структура совершала в свое хранилище событий. Мы удалили структуру / шаблон CQRS, и ошибки исчезли. Я уверен, что мы могли бы найти причину, если бы у нас было достаточно времени, но этого не произошло. Я подозреваю, что внутри библиотеки (CQRSLite) происходили какие-то небезопасные для потоков действия.
@ DavidBrowne-Microsoft Как мне получить доступ к DbContext из нескольких потоков, если блокировка не является хорошим решением?
Вероятно, это должен быть новый вопрос с дополнительным контекстом, а не комментарий к старому вопросу.





Версия 12.1 была первым выпуском Oracle.ManagedDataAccess. Я бы попробовал более новую версию, то есть 12.2