3

當我調試以下代碼時,當執行Delete()時,收到消息「System.TypeLoadException被捕獲」。無法加載類型'System.Data.Entity.Core.Mapping.EntityContainerMapping'

Using db As New ScholarshipEntities 

    db.ApplicationHistories.Where(Function(h) h.HistoryTypeId = 0).Delete() 
    db.SaveChanges() 

End Using 

我在Visual Studio 2013中使用EF 6.1。我還安裝了EntityFramework.Extended庫。

我沒有問題查詢結果。我認爲當Where方法沒有結果時可能會發生該錯誤,但事實並非如此。添加新模型(.edmx)也沒有問題,這是一些有此例外情況的人遇到的問題。

我剛剛升級到EF 6.1並安裝了擴展庫。這是我第一次使用其中一種擴展方法。我已經卸載並重新安裝了nuget包,但沒有成功。

的IntelliTrace顯示從Delete()調用(按順序)下列情況除外:

  • 'EntityFramework.Reflection.DynamicProxy' does not contain a definition for 'InternalQuery'
  • Cannot implicitly convert type 'EntityFramework.Reflection.DynamicProxy' to 'System.Data.Entity.Core.Objects.ObjectQuery<Scholarship.ApplicationHistory>'
  • Could not load type 'System.Data.Entity.Core.Mapping.EntityContainerMapping'

我已經added an issue的擴展庫的github上。

更新 我已經重新安裝EF和EF.Extended庫沒有運氣。我可以使用RemoveRange代替它。我能夠創建一個新項目,安裝軟件包,添加映射到同一數據庫的模型,併成功使用Delete。顯然,問題出在我目前的解決方案中。

在我的解決方案中,我有一個ASP.NET項目和一個常規庫項目。在ASP項目中,後面的代碼調用庫RemoveHistory中的方法。該庫包含業務邏輯和數據訪問的類。這兩個類都實現接口。實際的Delete發生在數據訪問類中。我的模型也駐留在這個庫項目中。

我可能會創建一個全新的項目並將所有內容都帶過來,但這需要相當長的一段時間。即使我做了,我想了解爲什麼它不能在第一個地方工作,這樣我就不必重複這個過程。

+0

從未使用過它,並且不確定這是否相關,但是基於[文檔](https://github.com/loresoft/EntityFramework.Extended)爲'EntityFramework.Extended',不應該刪除' db.ApplicationHistories.Delete(Function(h)h.HistoryTypeId = 0)'?我猜想'db.SaveChanges()'調用也是不必要的,如果它沒有將實體帶入上下文而被刪除。 – Mark

+0

您可能對'db.SaveChanges()'是正確的(直到'Delete'工作後我纔會知道)。在重構API後,您寫入的刪除方法已過時。目前的文檔說使用'query.Where(expression).Delete()'語法代替。也就是說,使用過時的語法會拋出相同的異常。不過謝謝你的評論! – Zairja

回答

0

我「解決」這個問題一段時間前。我最終會回去嘗試重現問題以確認我的懷疑。

解決方案中安裝了多個版本的實體框架。這似乎沒有影響基本的EF功能,但我確信它的確有一些微妙的,可能有問題的方式。

每次解決方案打開時,NuGet都會聲明無法完成卸載。通過NuGet卸載和恢復失敗,並且必須手動刪除軟件包。一旦完全刪除,我再次安裝軟件包。這解決了這個問題。

我希望我可以給出更多技術性的答案,但基本原因是忘記了仔細查看包文件夾和配置。

0

如果你想刪除某些行那樣做:

Using db As New ScholarshipEntities 

    db.ApplicationHistories.RemoveRange(db.ApplicationHistories.Where(Function(h) h.HistoryTypeId = 0)) 
    db.SaveChanges() 

End Using 

如果你想刪除單個實體那樣做:

Using db As New ScholarshipEntities 

    db.ApplicationHistories.Remove(db.ApplicationHistories.Single(Function(h) h.HistoryTypeId = 0)) 
    db.SaveChanges() 

End Using 
+0

謝謝。我知道EF6中的'RemoveRange'。但是,我試圖避免查詢數據庫,將它全部加載到內存中,然後像RemoveRange一樣刪除一個對象)。這是問題[這個人有](http://stackoverflow.com/questions/22157005/bulk-deleting-rows-with-removerange)。我試圖弄清楚的是,如果在EF.Extended中遇到了一些錯誤,或者我的設置在某處出錯了。目前,我必須一次性刪除一個對象(不使用EF.Extended),但我想利用這個庫及其承諾的好處。 – Zairja

+0

從哪裏來這個刪除方法,你正在使用?我還沒有在linq set中找到這樣的方法。 – mr100

+0

[EntityFramework.Extended library](https://github.com/loresoft/EntityFramework.Extended) - 我的問題標有它,我鏈接到我在項目的GitHub頁面上打開的問題。 – Zairja

相關問題