前言
到目前為止寫過剛好兩百來篇博客,看過我博客的讀者應該大概知道我每一篇博客都沿襲着一貫的套路,從前言到話題最終到總結,本文依然是一如既往的套路,但是不是介紹技術,也可說是介紹技術,不過是介紹書中的技術以及我對寫作的態度,作為對本書的宣傳,本書在最近即將出版,到時會在博客公告欄中放出購買鏈接。
寫作初衷
之前有過出版社的編輯找我寫書,我當時看了看也沒回復最終當然也就是不了了之了,最主要的是覺得自己資歷尚淺,寫書和寫博客有很大不同,寫博客在言語上可以略微隨意,而寫書需要的是嚴謹同時在表達上也應言簡意賅,后來怎么又寫上了呢,看了看自己寫的博客當屬EF最多,記得在我初次學習EF時,我還特意搜索了下有沒有相關中文的書籍作為參考資料,然而幾乎一本都沒有,后來我只能看看園中前輩們的博客和老外的文章來學習,最終也就寫了一部分不算完整的EF系列,這個時候我想到是不是可以寫一本EF 6.x和EF Core 2.0的書籍呢?作為EF 6.x和EF Core 2.0系統性學習的參考資料,若能幫助到初學和想繼續深入的同行將再好不過了,也算是我對.NET作出的一份努力,同時也希望通過本書讓您重新拾起對EF和EF Core的正確認知。
寫作態度
從選題材到寫完書大概耗時半年多的時間,在寫EF篇章時腳步稍微快些,因為之前寫過,只是在其過程中EF更新了一點點內容就花了一點時間去看文檔,所以相對來說比較熟練一點,到了EF Core篇章腳步放緩了很多,雖然我也有寫過,但是還不夠深入,所以相當於寫本書我從頭又學習了EF和EF Core並深入探索到一些不為人知的秘密。寫完后不久就開始了審稿,接着編輯那邊將問題統一歸納交由我修改,同時我也秉着對自己負責和對讀者負責的態度認真去修正文檔中的錯誤,絲毫不敢懈怠,修改了有問題的地方以及添加了部分內容,都是在凌晨發給了編輯(【捂臉】),在這里要對編輯說聲抱歉。以下是我從寫作開始到書正式出版的詳細記錄。
你必須掌握的Entity Framework 6.x和Core 2.0
書籍名稱如博客標題所言,您也可將本書看做是您所不知道的Entity Framework 6.x和 Core 2.0,比如您是否知道EF 6.0如何創建索引呢?比如您又是否知道在EF 6.x中如何正確更新數據呢?比如您又是否知道在EF Core中何種情況下即通過lambda表達式使用Include來進行飢餓加載不好使呢?比如您又是否知道在EF Core中通過Find或者FindAsync方法如何進行飢餓加載呢?比如您又是否知道EF Core上下文實例池本質是什么呢?這樣的疑問還有太多太多,本書如管中窺豹,帶您一探究竟。本書既面向基礎學習者也面向進階學習者,無論您是自學還是在項目中用到了EF 6.x抑或是EF Core 2.0,本書將對您或許有一定幫助。
推薦致謝
只見過張善友大哥,與其他幾位大佬素未謀面,不知是否能夠得到大佬們的認可,懷着忐忑的心情去找大佬們寫推薦,結果大佬們很快寫完就交給我了,在此表示感謝,感謝dudu老大、何鎮汐大哥,張善友大哥,趙培(好基友),鄒瓊俊大哥,感謝大佬們在百忙之中抽空為本書做推薦,感謝大佬們對本書的認可和支持。這里額外打個小廣告:何鎮汐大哥現作為.NET Core中國社區項目成員之一,以一己之力開發.NET Core平台下的應用框架(https://github.com/dotnetcore/Util),感謝何鎮汐大哥對.NET Core所作出的貢獻,同時也期待有志之士能夠參與進來。
寫作目錄
第一篇 1
第 1 章 7
EntityFramework歷史 7
1.1 EntityFramework版本介紹 7
1.2 EntityFramework 領域建模方式 9
1.2.1 Code First 9
1.2.2 Model First 10
1.2.3 Database First 10
1.3 使用EntityFramework Code First 6.x 或Core 2.0的原因 10
1.4 小結 11
第 2 章 12
數據庫表創建和遷移 12
2.1 數據庫連接和初始化策略 12
2.1.1 數據庫連接 12
2.1.2 數據庫初始化策略 15
2.2 約定 17
2.2.1 類型發現 17
2.2.2 主鍵約定 17
2.2.3 關系約定 19
2.2.4 復雜類型約定 20
2.2.5 自定義約定 21
2.3 基於代碼配置(Code-based Configuration Settings) 29
2.4 配置屬性映射和關系映射 32
2.4.1 屬性映射 32
2.4.2 關系映射 50
2.4.3 私有化屬性映射 67
2.5 繼承映射策略 69
2.5.1 Table per Hierarchy (TPH) 70
2.5.2 Table per Type (TPT) 70
2.5.3 Table per Concrete class (TPC) 73
2.5.4 Entity Splitting 77
2.5.5 Table Splitting 80
2.6 代碼遷移 82
2.6.1 遷移命令 82
2.6.2 遷移本質 91
第 3 章 102
實體狀態和數據操作 102
3.1 實體狀態 102
3.2 數據操作 105
3.2.1 數據查詢 105
3.2.2 數據保存 124
3.2.3 自動生成存儲過程 135
3.3 避免陷阱
3.3.1 導航屬性查詢
3.3.2 分頁查詢
3.3.3 語義可空
3.3.4 表值函數
3.3.5 日期操作
3.4 基礎篇實戰 138
3.4.1 復雜屬性作為JSON存儲數據庫表列 138
第二篇 153
第 4 章 155
上下文管理和變更追蹤原理 155
4.1 上下文生命周期管理 155
4.1.1 基礎模式追溯 155
4.1.2 生命周期追溯 157
4.1.3 進化模式追溯 160
4.2 變更追蹤原理 163
4.2.1 快照式變更追蹤(Snapshot based Change Tracking) 163
4.2.2 代理式變更追蹤(Notification based Change Tracking with Proxies) 165
第 5 章 175
變更追蹤原理和日志管理 175
5.1 DetectChanges原理 175
5.1.1 DetectChanges用途 175
5.1.2 調用DetectChanges方法時機 177
5.1.3 關閉自動調用DetectChanges方法 180
5.1.4 遺忘的二進制屬性和復雜類型 182
5.2 日志記錄 186
5.2.1 ToString打印 186
5.2.2 簡單日志打印 187
5.2.3 結構化日志輸出 190
5.2.4 構造塊攔截 192
5.2.5 攔截器異常性能監控 197
5.2.6 攔截器解決EF 6.1忽略字符串空格歷史遺留問題 211
5.3 事務 215
5.4 連接彈性 240
第 6 章 246
並發沖突 246
6.1 初級版解析 246
6.2 中級版解析 252
6.2.1 客戶端獲勝 253
6.2.2 數據庫獲勝 254
6.2.3 客戶端和數據庫合並獲勝 255
6.3 高級版解析 256
6.3.1簡單重試策略 257
6.3.2 Polly重試策略 257
第 7 章 262
性能優化實踐 262
7.1 優化一:預編譯視圖 262
7.2 優化二:減少首次與數據庫交互代碼 266
7.3 優化三:NGen安裝EntityFramework程序集 269
7.4 優化四:AsNoTracking 271
7.5 優化五:DbFunctions/SqlFunctions 271
7.6 優化六:緩存 276
7.7 優化七:重新編譯查詢 282
7.8 優化八:避免’N+1’ Select查詢 287
7.9 優化九:添加索引 289
7.10 優化十:關閉回調DetectChanges方法 293
7.11 優化十一:使用異步查詢 296
第 8 章 297
EntityFramework 6.x實戰 297
8.1 工作單元泛型倉儲模式(Generic Repository and a Unit of Work) 297
8.2 依賴注入泛型倉儲模式(Generic Repository Pattern and Dependency Injection) 321
第三篇 338
第 9 章 340
數據庫表創建和遷移 340
9.1 數據庫初始化策略 340
9.2 配置屬性映射和關系映射 344
9.2.1 屬性映射 345
9.2.2 Backing Fields 357
9.2.3 Alternate Keys 362
9.2.4. Shadow Property 363
9.2.5 Owned Entities 368
9.2.6 HasQueryFilter 369
9.2.7 關系映射 371
9.2.8 繼承映射 393
9.3 代碼遷移 398
9.3.1 控制台程序遷移 398
9.3.2 Web應用程序遷移 400
9.3.3 多個上下文遷移 413
9.3.4 腳手架逆向遷移 417
第 10 章 422
數據操作和初始化數據 422
10.1 實體狀態 422
10.2 數據操作 423
10.2.1 數據查詢 423
10.2.2 數據保存 446
10.3 無連接實體 452
10.4 初始化數據 455
第四篇 459
第 11 章 461
性能優化實踐 461
11.1 AsNoTracking 461
11.2 EF.Functions.Like 463
11.3 自定義標量函數 466
11.4 顯式編譯查詢 470
11.5 上下文實例池 473
第 12 章 479
查詢實體元數據和模型數據驗證 479
12.1 查詢元數據 479
12.2 內置模型驗證 481
12.3 第三方擴展模型驗證 484
第 13 章 488
上下文實例創建方式 488
13.1 顯式創建上下文實例 488
13.1.1 帶有構造函數的OnConfiguring方法 488
13.1.2 傳遞連接字符串參數到構造函數 489
13.1.3 使用不帶依賴注入的DbContextOptions 489
13.2 依賴注入容器創建上下文實例 490
13.2.1 帶有無參構造函數的DI 490
13.2.2 帶DbContextOptions的DI 491
13.3.3 使用泛型DbContextOptions 491
13.3.4 使用AddDbContext/AddDbContextPool 492
第 14 章 494
實現多租戶 494
第 15 章 504
捕獲審計數據 504
第 16 章 510
變更追蹤策略和日志管理 510
16.1 變更追蹤策略 510
16.1.1 INotifyPropertyChanged 511
16.1.2 INotifyPropertyChanging 514
16.2 日志管理 516
16.2.1 添加控制台包輸出 516
16.2.2 自定義日志輸出 517
第 17 章 521
xUnit單元測試 521
17.1 控制台單元測試 522
17.2 NET Core Web應用程序單元測試 524
第 18 章 527
事務和並發沖突 527
18.1 事務 527
18.2 並發沖突 533
18.2.1 初級版解析 534
18.2.2 中級版解析 538
18.2.3 高級版解析 543
第 19 章 550
EntityFramework Core 2.1待發布 550
19.1 新特性實現目標 550
總結
本書是我所理解的EF 6.x和EF Core 2.0,也有我個人的一些思考,若本書能夠對您有所幫助,那么如我寫博客一樣成就感就在於此了,期待本書能夠得到您的認可,我會一如既往和大家分享我所得。
購買通知
下個月可正式購買此書,我將在博客公告欄中標明購買鏈接,請大家耐心等待,謝謝。