2013-10-28 76 views
20

升級到實體框架6後,我們實現了我們自己的DbExecutionStrategy。除了現有的SqlAzureExecutionStrategy我們的策略還記錄異常。 原來,每15-30分鐘實體框架拋出內部SqlException System.Data.SqlClient.SqlException (0x80131904): Invalid column name 'CreatedOn'. 這是一個內部錯誤。似乎EF在某些表上存在CreatedOn列時會進行一些常規檢查。有沒有優雅的方式來防止這種異常被拋出?實體框架中CreatedOn列6

下面是一個調用堆棧:

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) 
+0

我也收到這個錯誤。 –

+0

[Entity Framework 4.3。無效的列名'CreatedOn'](http://stackoverflow.com/questions/12193465/entity-framework-4-3-invalid-column-name-createdon) – AXMIM

+0

「_...檢查是否存在CreatedOn列** some ** table._「您可以使用SQL Server Management Studio中的SQL分析器查找SQL EF發送到您的服務器的內容。在我的例子中,我看到'SELECT TOP(1)[c]。[CreatedOn] AS [CreatedOn] FROM [dbo]。[__ MigrationHistory] ​​AS [c]',它清楚地表明它與EF有關版本不匹配。 –

回答

31

在過去的實體框架用來在__MigrationHistory表中的列「CreatenOn」。

每次AppDomain啓動時,它都會檢查數據庫是否需要遷移。 EF實際上會嘗試讀取「Cr​​eatedOn」列,並顯然會失敗並記錄異常。 EF有一個醜陋的try/catch檢查這個檢查的所有塊,如果引發異常(缺少列),那麼它不會嘗試「遷移」CreatedOn列。

沒有辦法此刻禁用檢查,除非只是沒有記錄它...

2

對我來說,是發生這個錯誤,因爲我已經改變的Visual Studio調試例外設置打破在所有例外情況下(或比默認配置更多的例外情況)。重置Visual Studio的所有設置後,錯誤不再發生,並且我的應用程序按預期正常運行。

接下來的問題是Entity Framework有一個try/catch塊來處理這個錯誤,這樣當這個錯誤發生時應用程序不會停止工作。處理完錯誤後,它將應用程序返回到正常狀態,就像你在自己的應用程序的try/catch塊中也可以這樣做。因此,打破這些例外是讓我的代碼不必要地停止

當我調試一個複雜的程序時,打破所有異常是必要的,但在我不需要它之後,我應該重置調試異常設置。希望這可能有助於其他人同樣努力去解決環境問題。