這是我第一個EF項目,請耐心等待。實體框架中的多重結果4.1代碼優先
更新實體(如Department)時,將其從上下文中拉出,更新其值並調用context.SaveChanges。但是,如果您更新Department.Employees,EF不會覺得有趣。
我搜索,並與設置Multipleactiveresultsets =在連接字符串中真正的選擇上來,但想知道:
- 這是推薦的方法是什麼?
- 這是否會對性能產生不利影響/我應該注意什麼?
這是我第一個EF項目,請耐心等待。實體框架中的多重結果4.1代碼優先
更新實體(如Department)時,將其從上下文中拉出,更新其值並調用context.SaveChanges。但是,如果您更新Department.Employees,EF不會覺得有趣。
我搜索,並與設置Multipleactiveresultsets =在連接字符串中真正的選擇上來,但想知道:
只有當您想要在同一個連接上並行執行多個查詢時,才需要啓用MARS。如果你這樣做,會發生這種情況:
/* Foreach uses an iterator over the resultset of your query, but the query is not fetched
immediately, instead the iterator internally triggers fetching for single
processed record from opened data reader. Because of that the query and the reader
are active until the iteration is over. */
foreach (var department in context.Departments.Where(...))
{
/* The first query is still active on the connection but now you are executing
lazy loading of all related employees =>. You are executing a second query and,
without MARS, you will get an exception. */
var employee = department.Employees.FirstOrDefault(...);
}
如何避免這種情況?
context.Departments.Include(d => d.Employees)
這是推薦的方法是什麼?這是否會對性能產生不利影響/ 我應該注意什麼?
這取決於你正試圖解決的問題。如果您有多個部門要處理,訪問其員工集合將觸發每個部門的單獨查詢。這就是所謂的N + 1問題 - 你有N個部門和一個查詢來獲取它們,每個部門你將執行一個額外的查詢=> N + 1個查詢。對於大量的部門來說,這將是一個性能殺手。
急切的加載也不是防彈解決方案。它可以affect performance as well。有時,您只需執行單獨的查詢即可獲取所有必要的部門並單獨查詢以獲取所有必要的員工。如果關閉了延遲加載,它應該修復您的關係併爲您正確填寫Employees屬性。順便說一句,我做了一個suggestion on Data UserVoice來支持這個功能。
謝謝。我希望你能注意到這篇文章。爲您對Data UserVoice的建議投票。 –
爲了將來的參考也知道**並行只在代碼級**。從MSDN文檔* MARS可以在單個連接中交錯執行多個請求。也就是說,它允許批處理運行,並且在其執行過程中,它允許執行其他請求。但請注意,MARS是以交錯方式定義的,而不是以並行執行方式定義。* https://msdn.microsoft.com/en-us/library/ms131686.aspx – PedroC88