以前在使用 EF6 的時候,我就一直覺得有個困擾,那就是我們在 ASP.NET MVC 執行 Model Binding 的時候,除了 MVC 會幫你做輸入驗證與模型驗證之外,當你在執行 db.SaveChanges();
的時候,預設 Entity Framework 還會再讀取一次實體類別(Entity Class)上面定義的 DataAnnotations
定義,例如 [Required]
或 [StringLength]
這種,但這真的有點多此一舉。想不到從 EF Core 1.0 開始,這個特性就被移除了,但我 EF Core 6.0 才發現這件事,可見實務上真的很少用到! 😅
... 繼續閱讀 ...
Entity Framework Core 讓你可以透過「導覽屬性」快速的取得「關聯」資料,不過方便的背後可能會犧牲一些效能,早期在 Entity Framework 的年代,預設啟用「延遲載入」機制,這個預設值可能會導致許多意外的效能問題,以致於 "Entity Framework 很慢" 的臭名一直延續至今,即便 Entity Framework Core 已經沒有這個問題,許多初學者還是不太清楚如何正確的使用 Entity Framework Core 來存取關聯資料。這篇文章我就來說說 Entity Framework Core 提供的三種關聯資料載入策略,以及如何判斷何時該用哪種策略載入資料。
... 繼續閱讀 ...
我最近在研究如何讓 LINQPad 7 可以在每個查詢都使用 LINQPad.QueryPlanVisualizer 外掛來顯示 LINQ 實際執行的成效,顯示 SSMS 常見的執行計畫 (Query Execution Plan)。我發現在特定查詢安裝 NuGet 套件是可以使用的,但是依據官網的指示安裝成 Plugin 的話,就沒辦法正確使用,去 GitHub 提問也得不到什麼有效的答案,經過了好幾天的嘗試,我終於找出正確的設定方法,特別寫文章註記一下。
... 繼續閱讀 ...
在最近的幾個 Entity Framework Core 版本,對於 Logging (紀錄) 的撰寫方式一直在改變,大致上可區分成 EF Core 2.1
, EF Core 3.0+
與 EF Core 5.0
三種版本,這意味著你從網路上找到的資訊,很有可能是舊的,但很多人無法區別其差異,因為舊的寫法到了 EF Core 5.0 依然可以用,只是會被標示棄用而已。你應該也可以想像得到,越新的 EF Core 版本,寫法就會更簡單的,這篇文章我就來說說幾種不同的紀錄方法。
... 繼續閱讀 ...
由於 .NET Core 大量的使用 DI 技術,所有註冊到 DI 容器(ServiceCollection)的服務,幾乎都可以用「注入」的方式取得物件。只不過有些類別不容易用建構式注入的方式取得服務,這篇文章將分享如何在 EF Core 3.1 的模型驗證方法中注入 ServiceCollection 裡的任何服務。
... 繼續閱讀 ...
最近在我的台灣 .NET 技術愛好者俱樂部臉書社團有人問到如何在 EF Core 3.1 的 Code First 進行資料庫移轉時指定資料庫定序 (Database Collation)。我自己也嘗試了一下搜尋,網路上確實都找不到相關資料,但我覺得「理論上」應該很容易辦到,因此自己實驗了一下,也研究出方法,這篇文章將分享我的實際作法。
... 繼續閱讀 ...
在使用 LINQ to Entity 查詢 Entity Framework 中的資料時,當遇到必須篩選出資料庫中特定一天的資料時,這件事就會變得有點棘手,每次遇到這個問題都得查一下才會寫,因此今天決定寫點筆記日後備查。
... 繼續閱讀 ...
我們都知道 Entity Framework 是一個 ORM 框架,在應用程式中基本上都不太會去碰觸太多關於後端資料庫的特定語法,但針對一些效能調校或資料庫管理等需求時,其實還是能透過 Entity Framework 幫我們執行一些自訂的 T-SQL 語法,只是有些地方需要注意一下,如果你今天遇到無法在 Entity Framework 中執行預存程序或匯入函式時,那麼這篇文章可能對你有幫助。
... 繼續閱讀 ...
前陣子在教學的過程中,有位學員問了一個 Entity Framework 的問題,他在 SQL Server 資料庫中建立了一個報表用的檢視表 (Views),然後想要匯入到 Entity Framework 的 EDMX 實體資料模型中,但卻怎樣都匯不進去,主要原因就出在 Entity Framework 無法自動推斷該檢視表的主索引鍵為何,所以才會無法匯入,而本篇文章將說明匯入 SQL Server 檢視表 (Views) 到 Entity Framework 的注意事項。
... 繼續閱讀 ...
在 ASP.NET MVC 使用 Entity Framework 資料庫先行開發模式 (Database-First Development) 的時候,因為所有 POCO (Plain Old CLR Object) 類別都會透過 *.tt 程式碼產生器範本自動建立,當我們想擴充資料模型時,勢必不會直接把驗證屬性直接寫在這些類別裡,而是在另一個部分類別檔案中,透過 MetadataType 屬性 (Attribute) 宣告一個 Metadata 類別 (又稱 Buddy Class)。另一方面,我們也會在資料模型的 POCO 類別的「建構子」方法中宣告屬性的預設值,但這時問題來了,如果我們在自動產生的資料模型類別中,已經宣告過「建構子」的話,那我們該如何在另一個部分類別檔案中再次「宣告」建構子呢?這就是這篇文章想要解決的難題。
... 繼續閱讀 ...
使用 Entity Framework Code First 開發資料庫應用程式時,當資料庫首次建立後,預設 Entity Framework 就會幫你在資料庫中建立一個名為 __MigrationHistory 的系統資料表,這個資料表預設在 Visual Studio 2012 的伺服器總管中是看不到的,但就算看的到,也無法進行管理,使用上頗為不便。因此本篇文章就是要來告訴各位如何幫你把這個表格從「系統資料表」轉換成「使用者資料表」,如此一來就能方便的在 Visual Studio 2012 中管理。
... 繼續閱讀 ...
在許多開發情境下經常會試圖取回整個資料表的筆數,像我們就有個統計網站累積使用人次功能,開發人員寫的時候就是用 SELECT COUNT(*) FROM TableName 的方式來取得目前總共有多少人次進入網站,但用這種方式執行效率並不高,每次執行都會產生一次 Index Scan,也就是在 SQL Server 資料庫裡所有主索引鍵的資料都會被掃瞄過一次才能統計出資料總筆數,當資料越多的時候,效能就會越差,在這裡我提供另一種 hack 的方法可以更有效率的取得整個表格的總筆數,但此法僅適用於 SQL Server 喔!
... 繼續閱讀 ...
採用 Entity Framework 技術來開發應用程式有一個經常會遇到的問題,就是不知道到底 Entity Framework 幫我們產生了什麼 T-SQL 到資料庫,雖然 SQL Server 資料庫有 SQL Server Profiler 工具可以分析追蹤應用程式實際查詢的 T-SQL 語法,不過在開發階段用這種方式追蹤程式碼還是有點麻煩的,今天要介紹的 Entity Visualizer 擴充套件就非常適合用來查詢這些透 Entity Framework 產生的 T-SQL 語法,相信對開發偵錯工作可以帶來不小的幫助。
... 繼續閱讀 ...