閱讀 Abp Unit Of Work 文件後得知以下方法類型會被視為一個 unit of work:
- ASP.NET Core MVC 控制器操作。
- ASP.NET Core Razor 頁面處理程序。
- 應用服務方法。
- 存儲庫方法。
對於這些方法,UOW 會自動啟動,除非周圍(環境)UOW 已經在運行。
簡單來說,就是上面 4 種類型的方法在執行前會自動開啟事務,並在執行完無異常後,自動提交數據庫事務。
這也就意味著,在 GetListAsync 或者 GetAsync 方法中,如果變更了實體屬性的值,即使沒有調用 UpdateAsync 等來更新實體,在方法被成功執行後,他也會將變更同步到數據庫中,這是事務的功勞。
所以,我們要禁用 EFCore 的實體變更追踪功能,防止在 ReadOnly 的方法中無意的變更了實體的值,禁用的方法是被 ABP 封裝過的,參考:https://github.com/abpframework/abp/issues/17487
不過,確實,就算是在 ReadOnly 的方法中查詢數據,也不應該去變更實體屬性的值,而是變更 dto 的值,這樣,也不需要 DisableTracking 了。