2013-10-28 20 views
20

Sau khi nâng cấp lên Entity Framework 6, chúng tôi đã triển khai DbExecutionStrategy của riêng mình. Ngoài hiện tại, SqlAzureExecutionStrategy chiến lược của chúng tôi cũng ghi lại các ngoại lệ. Khi bật ra, mỗi 15-30 phút Khung thực thể ném nội bộ SqlException System.Data.SqlClient.SqlException (0x80131904): Invalid column name 'CreatedOn'. Đó là lỗi nội bộ. Có vẻ như EF thực hiện kiểm tra thường xuyên nếu cột CreatedOn tồn tại trên một số bảng. Có cách nào thanh lịch để ngăn chặn ngoại lệ này được ném không?CreatedOn column trong Entity Framework 6

Đây là một cuộc gọi stack:

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

Tôi cũng nhận được lỗi này. –

+0

Bản sao có thể có của [Entity Framework 4.3. Tên cột không hợp lệ 'CreatedOn'] (http://stackoverflow.com/questions/12193465/entity-framework-4-3-invalid-column-name-createdon) – AXMIM

+0

"_... kiểm tra nếu cột CreatedOn tồn tại trên ** một số ** table._ "Bạn có thể sử dụng lược tả SQL từ SQL Server Management Studio để tìm hiểu SQL EF đang gửi tới máy chủ của bạn. Trong trường hợp của tôi, tôi thấy 'CHỌN TOP (1) [c]. [CreatedOn] AS [CreatedOn] FROM [dbo]. [__ MigrationHistory] AS [c]', làm rõ rằng nó có liên quan đến EF phiên bản không phù hợp. –

Trả lời

31

Trong một Entity Framework quá khứ đã từng có một cột "CreatenOn" trong bảng __MigrationHistory.

Mỗi khi AppDomain bắt đầu nó sẽ kiểm tra nếu cần phải di chuyển cơ sở dữ liệu. EF thực sự cố gắng đọc cột "CreatedOn" và rõ ràng là không thành công với ngoại lệ được ghi lại. EF có một thử xấu xí/nắm bắt tất cả các khối xung quanh kiểm tra này và nếu ngoại lệ được ném (cột là mất tích) sau đó nó không cố gắng "di chuyển" CreatedOn cột.

Không có cách nào vào lúc này để vô hiệu hoá kiểm tra rằng, ngoại trừ chỉ không đăng nhập nó ...

2

Trong trường hợp của tôi, lỗi này đã xảy ra bởi vì tôi đã thay đổi trực quan Exceptions Studio gỡ lỗi Cài đặt để phá vỡ trong tất cả các trường hợp ngoại lệ (hoặc có nhiều ngoại lệ hơn cấu hình mặc định). Sau khi đặt lại tất cả các cài đặt của Visual Studio, lỗi không xảy ra nữa và ứng dụng của tôi chạy bình thường như mong đợi.

Vấn đề sau đó là khung thực thể có khối try/catch để xử lý lỗi này để ứng dụng không ngừng hoạt động khi lỗi này xảy ra. Sau khi xử lý lỗi, nó trả về ứng dụng về trạng thái bình thường, như bạn có thể làm trong các khối try/catch của ứng dụng của riêng bạn. Do đó, vi phạm các ngoại lệ này làm cho mã của tôi dừng không cần thiết.

Vi phạm tất cả các ngoại lệ là cần thiết trong khi tôi đang gỡ lỗi chương trình phức tạp, nhưng tôi nên đã đặt lại cài đặt ngoại lệ gỡ lỗi sau khi tôi không cần nữa. Hy vọng điều này có thể giúp người khác trải qua vấn đề môi trường khó khăn này.

Các vấn đề liên quan