27

升级到 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)
4

2 回答 2

48

在过去的实体框架中,__MigrationHistory 表中有一个“CreatedOn”列。

每次 AppDomain 启动时,它都会检查数据库是否需要迁移。EF 实际上尝试读取“Cr​​eatedOn”列,并且显然失败并记录了异常。EF 在此检查周围有一个丑陋的 try/catch all 块,如果抛出异常(缺少列),则它不会尝试“迁移” CreatedOn 列。

目前没有办法禁用该检查,除了不记录它......

于 2013-12-18T22:51:06.363 回答
5

就我而言,发生此错误是因为我更改了Visual Studio 调试异常设置以中断所有异常(或比默认配置更多的异常)。重置 Visual Studio 的所有设置后,错误不再发生,我的应用程序按预期正常运行。

那么问题是实体框架有一个 try/catch 块来处理这个错误,这样当这个错误发生时应用程序就不会停止工作。处理错误后,它会将应用程序返回到正常状态,您也可以在自己的应用程序的 try/catch 块中这样做。因此打破这些异常使我的代码不必要地停止

当我调试一个复杂的程序时,打破所有异常是必要的,但我应该在我不再需要它之后重置调试异常设置。希望这可以帮助其他人解决同样难以捕捉的环境问题。

于 2017-01-30T13:52:51.187 回答