前面幾篇使用 ChangeTracking 來幫我們追蹤物件狀態,但他必須公開狀態讓外部可以修改,為了解決不被外部隨意修改的問題,可以利用深複製回傳一份不同實例的物件,這樣就可以不被外部影響;操作資料庫仍是使用 EF / EF Core,當然這不受限,你可以挑選妳喜歡的控制方式,接著,來看看怎麼實現它吧。
自訂追蹤物件變化再透過 EF Core 存到資料庫
- 737
- 0
- Change Tracking
- 2023-06-09
前面幾篇使用 ChangeTracking 來幫我們追蹤物件狀態,但他必須公開狀態讓外部可以修改,為了解決不被外部隨意修改的問題,可以利用深複製回傳一份不同實例的物件,這樣就可以不被外部影響;操作資料庫仍是使用 EF / EF Core,當然這不受限,你可以挑選妳喜歡的控制方式,接著,來看看怎麼實現它吧。
上一篇提到了 ChangeTracking + EFCore.BulkExtensions.BatchUpdate,可以很輕易的幫我們產生出有異動的 Update SQL 語法,如何使用 ChangeTracking 追蹤物件變化再透過 EFCore.BulkExtensions 存到資料庫
很可惜的是 EFCore.BulkExtensions.BatchUpdate 沒有支援異動多張資料表,對於資料庫命令的往返會隨著異動的資料表而增加,這次我想要改使用 EF Core 原生的異動追蹤。
追蹤異動變化使用 ChangeTracking ,消化異動並存放到操作資料庫則使用 EF / EF Core,當然,這不受限,你可以挑選妳喜歡的控制方式,接著,來看看怎麼實現它吧。
以往我都使用 dotTrace 診斷 .NET 應用程式的使用狀況,可以得知執行時間、佔用記憶體、SQL Command 等。

但,NET Core 沒有支援 SQL ETW,代表攔截不到有關 SQL 的命令,於是我得尋求其它解方,MiniProfiler 則是這次的調查對象。
當有一個應用程序被用戶 ( SIGINT /Ctrl+C) 或 Docker ( SIGTERM / docker stop ) 停止時,它需要優雅地關閉一個長時間運行的工作;換句煥說,當應用程式收到關閉訊號的時候,要把工作做完,應用程式才可以關閉。微軟的 Microsoft.Extensions.Hosting 可以幫我們接收/處理關閉訊號,我們只需要告訴它要怎麼做就可以了,我在實作的過程當中,碰到了一些問題,以下是我的心得
以往 ASP.NET Core 可以使用 TestServer 來進行整合測試,現在多了一個選擇 WebApplicationFactory,WebApplicationFactory 基於 TestServer 又封裝了更多的功能,我覺得使用起來又更簡單了,如果可以的話可以改用它
由於 .NET Core 跨平台,除了可以部署在 VM 的 IIS 之外,Docker 也是選項之一,它的使用體驗甚至比 VM 還要來的好,部署速度也比 VM 快很多
.NET Generic Host 是 .NET Core 發展出來的基礎建設,可以和其他類型的 .NET 應用程式搭配使用例如背景服務的主控台應用程式,Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder 靜態方法,它來自於 Microsoft.Extensions.Hosting.dll,主要用來提供應用程式一個標準的啟動,包含注入、紀錄、組態,不同的應用程式框架 (HostService) 有不同的預設啟動設定,.NET Generic Host 讓我們的應用程式的生命週期的控制,啟動到結束的撰寫方式統一了。
Microsoft.Extensions.Configuration.dll 用來處理組態,讀檔、重新載入、支援多種格式,包括記憶體、Json、Xml、Ini,也可以像在 .Net Fx 用 Transform 切換組態。
它是在 .NET Core 的基礎建設之一,除了.NET Core,也支援 NET Framework 4.6.1 以上;也可以像在 .Net Fx 用 Transform 切換組態。
ASP.NET Core 預設的組態是 appSetting.json,本篇簡單介紹組態設定的使用方法,關於 ASP.NET Core 的 Host,以後再寫一篇為大家講解
以往在 NetFx 在專案的 AssemblyInfo.cs 加上 System.Runtime.CompilerServices.InternalsVisibleToAttribute("TestProject1"),就可以讓 "TestProject1" 存取 NetFx 專案內的 internal 成員;這技巧通常用於測試,既可隱藏,又可測試,真的好棒。
現在,新版的 .NET Project SDKs 已經沒有包含 AssemblyInfo.cs 靜態檔案了,作法就要做一些調整了
微軟提供的 DI Container (Microsoft.Extensions.DependencyInjection ),實作了 Microsoft.Extensions.DependencyInjection.Abstractions 抽象,讓我們也可很輕易的換成我們習慣的 DI Container,比如說,內建的 Microsoft.Extensions.DependencyInjection 沒有提供掃描 Assembly 的自動註冊,這時,在應用程式的進入點換成其它的 DI Container,比如 Autofac,就可以使用自動註冊。
只有增加使用 Autofac DI Container 的註冊,其餘的不用動,像是物件的依賴關係,取出物件方式。