Category: ef core

我個人偏愛用 GUID 當 Primary Key,但為避免索引破碎引發效能災難,我慣用的解法是另設自動跳號欄位當叢集索引(Clustered Index)。(延伸閱讀:GUID Primary Key 資料庫避雷守則) 因此,一個理想的 CREATE TABLE 範例會像這樣: CREATE TA...

昨天提到 EF Core 新增或更新資料 (UPSERT) 的簡便寫法,有讀者朋友提到是否能用 Attach() 跟 Entry().State = EntityState.Modified; 取代 Entry().CurrentValues.SetValues()? 感覺這得配合範例比較好解釋,所...

資料庫程式有一種常見的應用情境:傳入一筆資料,以 Primary Key 比對,若該筆資料不存在就新增,若已存在則改更新欄位。 這種動作被稱為 INSERT OR UPDATE,或簡稱 UPSERT,資料庫很多會提供對映做法,像是 MySQL 用 INSERT INTO Table (...) VA...

升級 .NET 6 踩到的小問題。 依之前學到的 EF Core Model 設計,string 屬性預設對映的欄位預設為 Nullable,標註 [Required] 才會宣告為 NOT NULL。 不過,這條規則到 .NET 6 已有所改變。某段 EF Core 寫入資料庫時冒出欄位不允許 NU...

我的部落格這兩天悄悄從 .NET 5 升級到 .NET 6。 過程遇到 EF Core 2.2 升 6.0 產生的奇怪問題,原本以為要搞很久,但修掉兩個 Issue 後意外沒再發現其他問題,簡單測試主要功能都正常,我就當改好了直接上線全民公測,大家若有發現問題請再回報唄。 【本文開始】 2020 年...

撰寫 EF Core 相關測試時,若偏向單元測試性質,除了真的連接資料庫實測試,若測試內容未高度依賴資料庫特性,還有更輕便、易控制且有效率的選擇。 使用真實資料庫是最省事最逼真的做法,但實務上可能會遇到困難,例如: 因軟硬體資源或網路限制,未必有專供測試的資料庫可用。 實際連線資料庫速度太慢,單元...

我們都知道 ASP.NET Core 依賴注入(DI)容器註冊服務有三種生命週期選項:Singleton、Scoped、Transient,依先前學習 Autofac 建立的概念,Singleton 是從頭到尾共用一個、Transient 是每次建立新物件,每次 Request 共用的 Scoped...

截至目前,我的 EF Core 範例都是用 dotnet ef migrations create 產生建立(或升級) Schema 所需程式,再透過 dotnet ef database update 或 DbContext.Database.Migrate() 套用 Migration 建立或修...

之前介紹過將 EF Core DbContext 動作包入 Transaction,做法有兩種:呼叫 DbContext.Database.BeginTransaction() 啟動交易、用 TransactionScope 包住 DbContext 動作。如果要將兩個以上 DbContext 包進...

寫 .NET 資料庫相關程式該用 EF/ORM 還是自己寫 SQL?就像手排車 vs 自排車,各有優劣及擅長的場合,亦各有支持者,我自己則是瀨尿牛丸派,單純 CRUD 用 EF (或自製 ORM) 享受強型別保護及不沾 SQL 的清爽,至於複雜查詢、批次更新刪除,則回歸自己寫 SQL 以確保執行效能...

上一篇玩了用效能監視器實地觀察 SQL Connection Pooling 運作,做實驗做上癮,就再來觀察另一個我好奇的議題 - EF Core 更新資料時會怎麼包 Transaction? 我們都知道,對 DbContext.DbSet<T> 進行 Add()、Remove() 等操...

如果你跟我一樣,過去在專案裡都是自己連資料庫寫 SQL 指令,轉用 EF Core 之後,免不了會想確認 Where().Select() 產生的 SQL 查詢是否有效率,好奇 SaveChanges() 背後 EF Core 是怎麼更新資料庫? 要解答上述疑惑,最好的方法莫過於啟用 Loggin...

昨天提到 EF Core 的 DbContext 有內建資料快取,與資料庫真實狀況可能存在落差,另外也提到,當兩個 DbContext 更新同一筆資料,則視 SaveChanges() 呼叫時機,以後者為準。 EF Core 能追蹤資料修改狀況,產生 UPDATE 指令時只會更新有修改的欄位,若兩個...