Подтвердить что ты не робот

Стол CreateOn в Entity Framework 6

После обновления до Entity Framework 6 мы внедрили собственную DbExecutionStrategy. В дополнение к существующей SqlAzureExecutionStrategy наша стратегия также регистрирует исключения. Как оказалось, каждые 15-30 минут Entity Framework генерирует внутреннее SqlException System.Data.SqlClient.SqlException (0x80131904): Invalid column name 'CreatedOn'. Это внутренняя ошибка. Кажется, что EF выполняет некоторые регулярные проверки, если столбец CreatedOn существует в некоторой таблице. Есть ли какой-нибудь элегантный способ предотвратить выброс этого исключения?

Вот стек вызовов:

   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, ref Boolean dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, ref Task task, Boolean asyncWrite, SqlDataReader ds)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, ref Task task, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch(Func`1 operation, TInterceptionContext interceptionContext, Action`1 executing, Action`1 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)
4b9b3361

Ответ 1

В прошлой структуре Entity Framework использовался столбец "CreatenOn" в таблице __MigrationHistory.

Каждый раз, когда AppDomain запускается, он проверяет, требуется ли Migration для базы данных. EF фактически пытается читать столбцы "CreateOn" и, очевидно, терпит неудачу с исключением, которое регистрируется. EF имеет уродливый try/catch весь блок вокруг этой проверки, и если исключение выбрано (столбец отсутствует), то он не пытается "мигрировать" столбец CretedOn.

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

Ответ 2

В моем случае эта ошибка происходила из-за того, что я изменил Настройки исключения отладки Visual Studio, чтобы разбить все исключения (или в более редких случаях, чем настройка по умолчанию). После сброса всех настроек Visual Studio ошибка больше не повторялась, и мое приложение выполнялось нормально, как ожидалось.

Проблема заключается в том, что Entity Framework имеет блок try/catch для обработки этой ошибки, чтобы приложение не переставало работать, когда эта ошибка происходит. После обработки ошибки он возвращает приложение в нормальное состояние, так же как и в вашем собственном приложении try/catch blocks. Таким образом, нарушение этих исключений делало мой код без необходимости.

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