【问题标题】:CreatedOn column in Entity Framework 6Entity Framework 6 中的 CreatedOn 列
【发布时间】:2021-11-16 23:40:17
【问题描述】:

升级到 Entity Framework 6 后,我们实现了自己的 DbExecutionStrategy。除了现有的 SqlAzureExecutionStrategy,我们的策略还记录异常。 事实证明,每 15-30 分钟实体框架抛出内部 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)

【问题讨论】:

  • 我也遇到了这个错误。
  • "... 检查 some 表上是否存在 CreatedOn 列。" 您可以使用 SQL Server Management Studio 中的 SQL 分析器来找出SQL EF 发送到您的服务器的内容。在我的例子中,我看到了SELECT TOP (1) [c].[CreatedOn] AS [CreatedOn] FROM [dbo].[__MigrationHistory] AS [c],这清楚地表明它与 EF 版本不匹配有关。

标签: c# entity-framework azure-sql-database


【解决方案1】:

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

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

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

【讨论】:

  • 它是特定的异常检查还是普通的?我的意思是,如果抛出 OutOfMemory 或任何连接异常,是否会被理解为缺少 CreatenOn 列,或者它正确地冒泡了异常?
  • 既然 EF 是开源的,你能否指出源代码中丑陋的 try/catch 块。也许社区修复和拉取请求是有序的。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2017-12-31
    • 2021-12-22
    • 1970-01-01
    • 2017-04-04
    • 2014-03-15
    • 2017-08-05
    相关资源
    最近更新 更多