2013-11-22 39 views
3

我有一個使用Entity Framework 6POCO code first approach的項目。我有一套我已經包含在我的項目中的類庫,以允許重用代碼。這些庫使用代碼合同。使用實體框架,代碼優先(POCO)和代碼合同運行更新數據庫時出現錯誤

我也啓用了Static和Runtime檢查我的啓動項目。

該項目建立良好,正確執行。當我執行「更新數據庫」時,數據庫已成功創建。

當我試圖在數據庫種子化過程中使用代碼合同的外部庫中調用方法時,出現了我的問題。如果我省略這些功能,它會正確種子。如果我包含一個具有代碼合同的函數,那麼當我執行「更新數據庫」時,我會得到以下內容。需要注意的是生成表結構的SQL正確執行。這隻影響播種的SQL

運行種子法。 System.Runtime.Serialization.SerializationException:類型不 解決的成員 'System.Diagnostics.Contracts._ ContractsRuntime + ContractException + ContractExceptionData,WebForms的, 版本= 1.0.0.0,文化=中立,公鑰=空'。在 System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
在System.Data.Entity.Migrations.Design.ToolingFacade.Run(跑壘員 澆道)在 System.Data.Entity.Migrations.Design.ToolingFacade.Update(字符串 targetMigration,布爾力)在 System.Data.Entity.Migrations.UpdateDatabaseCommand。 <> c
_DisplayClass2。 < .ctor> B_ 0() 在 System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(動作 命令)類型未解決的構件 「System.Diagnostics.Contracts。 _ContractsRuntime + ContractException + ContractExceptionData,WebForms, Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'。

+0

我有同樣的問題,我猜這是'ContractException'類是內部問題,因此不會引發異常細節到控制檯,可能是跨越'AppDomain'邊界的問題。 – nicodemus13

回答

0

我已經管理不完全解決這個問題,但至少能夠解決如何隔離問題。你的外部方法是提高

顯然一個ContractException這並不有效報告到控制檯,可能是由於其是跨邊界AppDomain一個internal類和非constructible?

假設可以,請轉至項目屬性並在Code Contracts選項卡上關閉Perform runtime contract checking。對我來說,這立即突出顯示了這個問題,因爲遷移代碼在實際的細節上拋出了一個ArgumentException

如果這不顯示問題,那麼您需要計算出Contract最有可能失敗的位置,並用「正常」異常替換每個ContractException並重新測試,直到拋出「正常」異常爲止確定哪個合同失敗。

然後是否對此程序集進行運行時合同檢查是一個問題。你有三個選擇:

  1. 設計您的代碼,以確保沒有Contract.Requires的(這我假設它是)可以在運行時失敗(這是它應該是什麼樣的理論),而不是擔心。然後,您將遇到一些困難,調試任何您錯過的情況下可能發生的問題。

  2. 關閉運行時檢查。這樣你會得到一個'正常'的例外(儘管理論上應該沒有任何的例外)。有些人喜歡這樣做,有些人則不喜歡。我寧願保留它們。

  3. 將無法​​處理ContractExceptions的任何代碼隔離到其自己的程序集中,並關閉運行時合同檢查。不一定是理想的,但它可以讓你保持運行時檢查代碼的其餘部分。

相關問題