在開發使用EF作爲ORM的ASP.NET MVC解決方案時,我開始構建一個罕見的bug(或Heisenbug,因爲它完全消失,分步調試)。Views中的隱式EF查詢導致與DataReader相關的InvalidOperationException
在SO,我發現我的錯誤的來源可以是:
DbContext
是在我的域模型的靜態懶惰<> -wrapped字段,因而受到using(){}
成語多個結果集。- 我的視圖本身會調用HtmlHelper自定義擴展方法,其中包含EF查詢(例如DropDown選擇填充,縮略圖鏈接生成等)。
通過將multipleactiveresultsets=True
添加到我的connectionString
定義中即可解決第一個問題。
後者假設需要切換到ViewModels,預填充在控制器操作中。但是,在許多情況下,使用ViewModel會導致過度殺傷,因此需要添加虛擬副本創建代碼,這會導致維護開銷。
我的問題是:
- 爲什麼EF查詢中查看導致
There is already an open DataReader associated with this Command which must be closed first.
錯誤?做他們? - 如何停止視圖執行沒有完整的代碼庫重寫查詢?
謝謝你這樣一個全面的答案!不過,我總是將'List <>'傳遞給我的View。問題是(可能)由我寫的Html助手擴展引發的。他們顯然是從View調用的並且有EF查詢(同時返回'Select <>'和'IEnumerable',由'Select()'返回)。它可能是問題的根源嗎? – berezovskyi
我不知道如何回答這個問題,但是你的堆棧跟蹤可能會顯示你調用EF查詢的方法...... – Pawel