查缺補漏系統學習 EF Core 6 (一)

推薦關注「碼俠江湖」星標,時刻不忘江湖事

掌握 ORM 開發方式是每一個 .NET 開發者所必備的技能,而且 .NET 平臺有很多優秀的 ORM 框架。

很多人都會詬病 .NET 官方標配的 Entity Framework,感覺其笨重難用、性能低下。

但其實經過多年發展,EF Core 已經是 .NET 平臺中的新一代 ORM 框架。

雖然是上一代 EF 的跨平臺版本,但在其本就無比安全穩定的基礎上,做了很多的改進,摒棄了一些包袱、優化了性能,豐富了擴展等。

這個系列的目的,就是全面的講述 EF Core,讓大家對其有一個系統的了解,內容較為精煉,不會有太多廢話。

1c8bb4795b806e826b218dbbd0aec64d.png

基礎概念

想要使用 EF Core,必須安裝 Microsoft.EntityFrameworkCore 庫,它提供了 EF Core 核心功能。

除此之外,我們還需要安裝與你使用的數據庫相匹配的數據庫提供程序。

比如,本文示例使用的是 SQL Server LocalDB,所以我需要安裝 Microsoft.EntityFrameworkCore.SqlServer庫。

模型

EF Core 是一個 ORM 框架。

什么是 ORM?也就是 「Object Relational Mapping」,對象關系映射。

這里的 Object ,在 EF Core 中,以實體類來表示。

實體類是 EF Core 用于映射到數據庫表的一個類。

在這個示例中,有一個 Entities 文件夾,用來存放與 EF Core 相關的實體類,里面有一個名為 Account 的實體類。

166f158186dbe9d624b45b6b40e77ac6.png

EF Core 中有一系列的規則,來幫助它將實體類映射到數據庫表中。

Account 實體類為例,這個映射過程很簡單:

66efb377810953bb88b502559d9e8826.png

首先,EF Core 通過實體類,擁有了用于列和配置映射的表的信息。

接下來,這個類中的所有公共屬性,都會被映射到表的列中,并具有與屬性相同的名稱。

最后,EF Core 使用命名約定,在數據庫表中從 AccountId 屬性中,創建一個主鍵。

連接字符串

EF Core 是一個面向數據庫的 ORM 框架,我們就必須為它提供數據庫的信息,也就是數據庫連接字符串。

一般情況下,我們使用 「appsettings.json」 配置文件,為 EF Core 提供連接字符串。

{"ConnectionStrings":?{"DefaultConnection":?"Server=(localdb)\\MSSQLLocalDB;Database=CodeMan;Trusted_Connection=True;MultipleActiveResultSets=true"}
}

在這個示例中,提供的連接字符串是,SQL Server LocalDB 中的默認實例,指定的數據庫名稱是 「CodeMan」

需要注意的是,由于連接字符串屬于敏感信息,所以使用配置文件來存儲連接字符串,并不是最好的做法,特別是對于生產環境。

那么針對生產環境,更好的方法就是使用環境變量來提供諸如連接字符串的敏感信息。

依賴注入

EF Core 中有一個非常重要的東西,就是數據上下文類。

在這個示例中,Entities 目錄中的 ApplicationContext 類型,就是 EF Core 在當前應用中的上下文類。

9a2b60afdd8fc8eac32371a8c7314180.png

這個類必須繼承自 DbContext 基類,它包含訪問數據庫的信息和配置。

構造函數使用 DbContextOptions 參數,為基類提供額外的選項。

其中最重要的是 DbSet<Account> 類型的 Accounts 屬性。

EF Core 會在上下文類中,查找所有的公共 DbSet 屬性,將它們的名稱映射到數據庫中的表的名稱。

然后,它會進入 DbSet<T> 提供的泛型類,在我們的例子中,它是一個 Account 類,并將所有的公共屬性,映射到表中具有相同名稱和類型的列。

如果 Account 類對其他類有任何引用,EF Core 還會使用這些引用屬性,并在數據庫中創建相應的關系。

讓我們回到在?Main?方法中:

4b336551bb3da93f44e2f382e627196d.png

首先,我們創建了一個讀取?appsettings.json?配置文件的配置對象,用來獲取連接字符串

然后,在依賴注入系統中,通過使用?AddDbContext?方法,來注冊?ApplicationContext?上下文類

在它的配置委托中,使用?UseSqlServer?方法,設置連接字符串。

在這個示例中,還注冊了一個?AccountService?服務,該服務的實現類,通過構造函數注入了上下文實例。

這樣我們就可以在服務類中,使用上下文實例。

上下文池

需要注意的是,在EF Core 中,注冊上下文類的方法有兩種:

AddDbContext 方法注冊的上下文類型,生命周期模式默認是作用域,這個作用域的范圍是線程,在 ASP.NET Core 應用中作用域的范圍表現為一個請求。

因為上下文實例是非線程安全的,所以我們一般不需要去修改它的生命周期模式。

另外還有一個 AddDbContextPool 方法,它用來配置上下文實例池。

1d0874454f27c711dda6d158fef5b256.png

上下文池可以重復使用上下文實例,而不是為每個請求創建新的實例。

當應用請求上下文實例時 EF Core 會首先檢查池中,是否有可用的實例。

請求處理完成后,上下文實例的任何狀態都會被重置,然后回到池中。

也就是說,保存在池中的可以復用的上下文實例,它不會再被初始化。所以,它不太適合在每一次使用它,都需要初始化的場景。

上下文池可以提高大型 Web 應用的吞吐量。默認情況下,池中保持的上下文實例數是 1024 個,這個值可以通過 poolSize 參數進行修改,示例中修改為 2048 個。

一旦池中保存的實例數超出池大小,就不會再保存新的上下文實例,此時 EF Core 會回退到「按需創建實例的非池行為」

池的大小需要根據實際情況去設置,池容量太小,如果不夠用就會回退到非池行為,此時池的意義不大。

如果池容量太大,則可能消耗不必要的內存,因為未使用的上下文實例,也保留在池中。

一般情況下,池的性能提升通常可以忽略不計,除非是在高度優化的方案中。

上下文類

我們現在再回頭看一看 ApplicationContext 上下文類:

3b4f560f141e5f75d4cd56f6aeec29d1.png

它的構造函數中,接受了一個 DbContextOptions 類型的參數,這個參數用來提供上下文的選項。

除了直接使用 DbContextOptions 類型,還可以使用泛型版本 DbContextOptions 類型。

public?ApplicationContext(DbContextOptions<ApplicationContext>?options)

無論使用哪個版本,我們的應用都會正常工作。

使用哪一個版本,取決于你的應用中是否有多種上下文類型。

如果應用中有多種上下文類型,就推薦使用泛型版本,而當前示例的情況并非如此,所以使用的是非泛型版本。

DbContext有三個重要的屬性:

  • Database 屬性負責與數據庫的交互、數據庫的遷移/創建和原始 SQL 查詢。

  • ChangeTracker 屬性用于跟蹤通過同一上下文實例,查詢出的實體狀態。

  • Model 屬性提供了對 EF Core 在連接,或創建數據庫時,使用的數據庫模型。

我們可以使用 Model 屬性,來訪問每個實體及其屬性的信息。

不過,這需要我們安裝 Microsoft.EntityFrameworkCore.Relationa 庫。

然后在 AccountService 實現類的 Run 方法中,就可以通過使用上下文實例的 Model 屬性,找到上下文中的任意實體,并獲取它的一些信息,比如表名和主鍵字段名。

小結

這篇文章,講述了 EF Core 的一些基本概念:模型、連接字符串、依賴注冊、上下文池與上下文類。

下篇文章,我們將盤點一下 EF Core 的屬性配置。

更多精彩內容,請關注我▼▼

4bb48140a5470dea7dd7e0639ea0f6c8.gif

如果喜歡我的文章,那么

在看和轉發是對我最大的支持!

(戳下面藍字閱讀)

03ef2db7e3ccfd1c7079fda0baaf324f.png

推薦關注微信公眾號:碼俠江湖

? ? ? ? ? ? ? ? ? ? ? ??6c4084e1eca54d504a480c8331255af5.png覺得不錯,點個在看再走喲

7301f26356a44c4c511715e61b1b18cc.gif

如果喜歡我的文章,那么

在看和轉發是對我最大的支持!

(戳下面藍字閱讀)

09e90918c268982ec6cef3f5b96c090b.png

推薦關注微信公眾號:碼俠江湖

? ? ? ? ? ? ? ? ? ? ? ??fc04a37bca55a777c52dd6d08c4ed09e.png覺得不錯,點個在看再走喲

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/287738.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287738.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287738.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql 5.5 mysqldump_mysql 5.5 mysqldump 原文翻譯

根據mysql 5.5第6.4章節理解和自己翻譯水平有限如有紕漏請指教,原文如下.6.4 使用mysqldump備份(Using mysqldump for Backups)首先多余的不用說了備份用來干什么大家都清楚。mysqldump備份分兩種輸出形式&#xff1a;1. 無--tab選項&#xff0c;輸出標準的SQL格式。輸出包含CR…

【經典回放】JavaScript學習詳細干貨筆記之(一)

【經典回放】JavaScript學習詳細干貨筆記之&#xff08;一&#xff09; 【經典回放】JavaScript學習詳細干貨筆記之&#xff08;二&#xff09; 【經典回放】JavaScript學習詳細干貨筆記之&#xff08;三&#xff09; 目錄 一、為什么要學JavaScript 二、JavaScript經典案例 …

Java Attach API

catalog 1. instrucment與Attach API 2. BTrace: VM Attach的兩種方式 3. Sun JVM Attach API 1. instrucment與Attach API JDK5中增加了一個包java.lang.instrucment&#xff0c;能夠對JVM底層組件進行訪問。在JDK 5中&#xff0c;Instrument 要求在運行前利用命令行參數或者系…

TCP之三次握手和四次揮手過程

1 TCP包頭里面的標志位 下圖為TCP頭部里面部分信息,入下標志位,每個標志位占一位。 標志位這里會涉及3個,ACK SYN FIN ACK:確認序號有效。 SYN:發起一個新連接。 FIN:釋放一個連接。 2 三次握手過程 第一次握手 Client將標志位SYN置1,隨機產生一個值seq=J,并將數…

Handler 機制分析

android 子線程和UI線程的交互主要使用Handler的方法進行通信。本文分析Handler機制 Handler 如何使用&#xff1f; Handler的使用比較簡單 public class MainActivity extends Activity{private Handler handler new Handler() { public void handleMessage(Message msg) { …

gearman mysql編譯_gearman初探(一、編譯和安裝)

gearman是一個任務分發系統&#xff0c;將計算比較耗時的任務分發給不同的機器專門進行計算&#xff0c;而任務發起的初始程序不必等待這些任務完成就可以返回而繼 續執行。筆者最開始做PHP郵件發送的時候&#xff0c;因為郵件發送耗時比較長&#xff0c;這時PHP腳本就會被阻塞…

《假如編程是魔法之零基礎看得懂的Python入門教程 》——(四)了解魔法百寶箱列表、字典及基本數據類型

學習目標 了解魔法世界中可更改容器——變量了解魔法世界的基本數值類型——字符串、整數了解魔法百寶箱——字典、列表了解列表如何添加值了解字典如何添加值了解字典與列表定義的不同符號 目錄 第一篇&#xff1a;《假如編程是魔法之零基礎看得懂的Python入門教程 》——&…

TCP協議之如何保證傳輸的可靠性

一、問題 TCP協議之如何保證傳輸的可靠性?我們先看下TCP的頭部圖片和TCP頭部的字段 /*TCP頭定義,共20個字節*/ typedef struct _TCP_HEADER {short m_sSourPort;       // 源端口號16bitshort m_sDestPort;       // 目的端口號16bitunsigned int …

【工具篇】在Mac上開發.Net Core需要的工具

微信公眾號&#xff1a;趣編程ACE關注可了解更多的.NET日常開發技巧,如需幫助&#xff0c;請后臺留言&#xff1b;[如果覺得本公眾號對您有幫助&#xff0c;歡迎關注]在Mac上開發.Net Core需要的工具如果您是一個.NET 開發者&#xff0c;想從Windows切換到Mac上開發.NET或者您已…

【Pix4d精品教程】Pix4Dmapper完整航測內業操作流程手把手圖文教程

1. 作業流程圖 2. 原始資料準備 原始資料包括影像數據、POS數據以及控制點數據。 確認原始數據的完整性,檢查獲取的影像中有沒有質量不合格的相片。同時查看POS數據文件,主要檢查航帶變化處的相片號,防止POS數據中的相片號與影像數據相片號不對應,出現不對應情況應手動調…

關于構造函數和this調用的思考

文中一系列思考和內容引發自以下問題&#xff1a;我需要在一個類的構造函數中調用另一個對象的構造函數&#xff0c;并使用this初始化其中的一個引用成員。 主要遇到的問題&#xff1a; 1. 構造函數的初始化列表中能訪問this嗎&#xff1f; 很明顯c創建一個對象分為兩部分&…

mysql semi join_MySQL 5.6 Semi join優化之materialization strategy

8月 24, 2014 |Nix.Huang考慮如下查詢&#xff1a;select * from Countrywhere Country.code IN (select City.Countryfrom Citywhere City.Population > 7*1000*1000)and Country.continentEurope這個子查詢是非相關子查詢&#xff0c;我們能和外層循環獨立的執行它&#x…

【ArcGIS風暴】何為動態投影?這次全面為您揭開ArcGIS中動態投影的神秘面紗!

本課程配套藍光視頻: 【ArcGIS風暴】GIS動態投影問題 GISer們都見過以下警告,該警告的原因是當前加載的數據的坐標系和當前數據框坐標系不一致導致的,核心問題是地理坐標系不一致。如當前數據的坐標系是GCS_Xian_1980,而數據框的坐標系有可能是WGS_1984等,總之跟要加載的數…

《假如編程是魔法之零基礎看得懂的Python入門教程 》——(五)我的魔法竟然有了一絲邏輯

學習目標 了解魔法世界中的結構表現——縮進了解魔法世界的邏輯判斷——if了解魔法世界的多次邏輯判斷——ifelse嵌套了解魔法世界中的邏輯運算——且 and 與或 or 推薦 1.《備受好評的看得懂的C語言入門教程》 目錄 第一篇&#xff1a;《假如編程是魔法之零基礎看得懂的P…

類和類之間的關系

一、類和類之間的關系 UML類圖中&#xff0c;常見以下幾種關系: 1、泛化&#xff08;Generalization&#xff09; 是一種繼承關系&#xff0c;比如動物類和老虎類&#xff0c;老虎繼承動物&#xff0c;子類如何特化父類的所有特征和行為 箭頭指向:帶三角箭頭的實線&#xff0…

Java SpringMvc+hibernate架構中,調用Oracle中的sp,傳遞數組參數

一、問題 我們調用數據&#xff0c;大都是可以直接獲取表中的數據&#xff0c;或者用復雜點的sql語句組成的。但是&#xff0c;有時候&#xff0c;當這樣達不到我們要的全部數據的時候&#xff0c;這時&#xff0c;我們就用到了存儲過程【sp】&#xff0c;如果sp需要參數是數組…

js模擬blur

<div></div> 某個事件給div加個屬性 $(div).attr(wait,true); $(div).click(function() { if(false!$(this).attr(wait)) return false; })轉載于:https://www.cnblogs.com/cndxk/p/4788414.html

中國第一朵企業云

本文講的是中國第一朵企業云&#xff0c;【IT168 資訊】算起來&#xff0c;中國中化集團公司的ERP完全運行在“云”上已經一個多月了&#xff0c;每每提到這個“創舉”&#xff0c;信息技術部總經理彭勁松顯得有些興奮&#xff0c;卻仍然很謹慎。作為中國第一家企業云的實踐者&…

查缺補漏系統學習 EF Core 6 - 實體配置

推薦關注「碼俠江湖」加星標&#xff0c;時刻不忘江湖事這是 EF Core 系列的第二篇文章&#xff0c;上一篇文章講解了 EF Core 的一些基礎概念&#xff0c;這一篇文章主要圍繞實體屬性的配置。點擊上方或后方藍字&#xff0c;閱讀 EF Core 系列合集。實體配置配置實體的目的&am…

【ArcGIS風暴】捕捉VS經典捕捉,誰更有用武之地?

幾乎所有的GIS軟件都具有捕捉功能!今天我們一起來聊一聊ArcGIS軟件中的捕捉功能吧。 ArcGIS軟件中有兩個重要的捕捉工具:捕捉和經典捕捉。 目錄 一、捕捉(Snapping) 1、捕捉類型 2、捕捉選項