升级到 Entity Framework 6 后,我们实现了自己的 DbExecutionStrategy。除了现有的 SqlAzureExecutionStrategy 我们的策略还记录异常。
事实证明, Entity Framework 每隔 15-30 分钟就会抛出内部 SqlException
System.Data.SqlClient.SqlException (0x80131904):列名称“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)
最佳答案
在过去, Entity Framework 曾经在 __MigrationHistory 表中有一列“CreatedOn”。
每次 AppDomain 启动时,它都会检查数据库是否需要迁移。 EF 实际上尝试读取“CreatedOn”列,但显然会失败,但会记录异常。 EF 围绕此检查有一个难看的 try/catch all block ,如果抛出异常(缺少列),则它不会尝试“迁移”CreatedOn 列。
目前没有办法禁用该检查,除了不记录它...
关于c# - Entity Framework 6 中的 CreatedOn 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19646659/