Oracle.ManagedDataAccess.Client выдает исключение NullReferenceException

Я использую 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?

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

Wernfried Domscheit 15.11.2018 18:18

Теперь вы можете получить драйверы Oracle из NuGet nuget.org/packages/Oracle.ManagedDataAccess, так что попробуйте. А также убедитесь, что вы не обращаетесь к экземпляру DbContext из нескольких потоков, что может вызвать спорадические сбои с любым поставщиком.

David Browne - Microsoft 15.11.2018 18:20

Собираюсь попробовать обновиться до 12.2. Вопрос @ DavidBrowne-Microsoft: если весь доступ к DbContext всегда заключен в блокировку, предотвратит ли это спорадические сбои?

Jeff F. 15.11.2018 20:47

да. Доступ к DbContext можно получить из разных потоков, но не одновременно. Хотя для производительности вы обычно этого не делаете.

David Browne - Microsoft 15.11.2018 21:12

Я также периодически получаю эту ошибку, и мне не везет ни с чем, что я пытаюсь. Вы нашли какое-нибудь исправление?

Andy Arndt 21.11.2018 16:44

Я обновил Oracle.ManagedDataAccess через NuGet. Я больше не видел эту ошибку, но она была спорадической, поэтому я не уверен на 100%, что она исправлена.

Jeff F. 27.11.2018 21:37

На прошлой неделе я фактически обновил Oracle.ManagedDataAccess и Oracle.ManagedDataAccess.EntityFramework до версии 18.3.0. Никаких ошибок до сегодняшнего дня :( Снова та же ошибка. Похоже, это ситуационная (IE: обрабатываются сотни записей, затем все записи в течение 3 или 4 минут получают эту ошибку, затем обрабатываются другие записи).

Andy Arndt 27.11.2018 21:57

@AndyArndt, можешь дать мне знать, если еще что-нибудь придумаешь? Я тоже дам тебе знать. Спасибо!

Jeff F. 28.11.2018 15:00

Я открыл обращение в службу поддержки Oracle, чтобы посмотреть, могут ли они хотя бы указать нам правильное направление для поиска проблемы. Я обновлю то, что узнаю.

Andy Arndt 29.11.2018 23:23

Я нашел место, где возможен доступ к контексту db из отдельного потока без блокировки. На самом деле это может быть основной причиной этого. Вы можете поискать это в своем коде.

Jeff F. 30.11.2018 20:57

Мое решение вроде как грустное. В нашем сервисе мы использовали структуру CQRS. Все наши ошибки этого типа, казалось, были вызваны вызовами, которые эта структура совершала в свое хранилище событий. Мы удалили структуру / шаблон CQRS, и ошибки исчезли. Я уверен, что мы могли бы найти причину, если бы у нас было достаточно времени, но этого не произошло. Я подозреваю, что внутри библиотеки (CQRSLite) происходили какие-то небезопасные для потоков действия.

Andy Arndt 21.12.2018 17:45

@ DavidBrowne-Microsoft Как мне получить доступ к DbContext из нескольких потоков, если блокировка не является хорошим решением?

sinsedrix 18.03.2020 15:44

Вероятно, это должен быть новый вопрос с дополнительным контекстом, а не комментарий к старому вопросу.

David Browne - Microsoft 18.03.2020 15:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
13
757
0

Другие вопросы по теме