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

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

這是 EF Core 系列的第二篇文章,上一篇文章講解了 EF Core 的一些基礎概念,這一篇文章主要圍繞實體屬性的配置。

點擊上方或后方藍字,閱讀 EF Core 系列合集。

bc9487f3b6041600a956476be54e1bca.png

實體配置

配置實體的目的,是為了讓實體屬性與數據庫表字段實現正確的映射。

EF Core 有三種方式來配置實體:按約定、數據注釋、Fluent API,下面依次進行闡述。

按約定配置

按約定配置,是指 EF Core 遵循一套關于屬性類型和名稱的簡單規則,并相應地配置數據庫。

按約定的配置,可以被數據注釋(特性)或 Fluent API 重寫。

比如,下面這個示例中:

public?class?Account
{public?Guid?AccountId?{?get;?set;?}public?string?Name?{?get;?set;?}public?int?Age?{?get;?set;?}
}

EF Core 通過遵循命名規則,來配置 Account 實體類中的主鍵字段。

如果實體類擁有一個名為 Id 的屬性,或一個<類名+Id>的組合,它就會被作為主鍵。

如果實體類中有一個復合主鍵,我們就不能按約定配置了。

當 EF Core 使用按約定的配置時,它會遍歷所有的公共屬性,并通過它們的名稱和類型來映射它們。

示例中,Name 屬性是一個可以為 Null 的字段,因為字符串類型的默認值是 Null

Age 屬性不會為 Null,因為它是一個值類型。

當然,如果你想讓 Age 屬性,在數據庫中可以為 Null,那需要在類型后加上 「?」 后綴:

public?int??Age?{?get;?set;?}

數據注釋

數據注釋的表現形式就是特性,它不僅可以用來配置實體屬性,還可以永遠驗證實體數據是否合法。

我們來替換一下 Account 實體類中的內容:

using?System;
using?System.ComponentModel.DataAnnotations;
using?System.ComponentModel.DataAnnotations.Schema;namespace?ConsoleApp1.Entities
{[Table("Account")]public?class?Account{[Column("AccountId")]public?Guid?Id?{?get;?set;?}[Required][MaxLength(50,?ErrorMessage?=?"長度必須小于50個字符")]public?string?Name?{?get;?set;?}public?int?Age?{?get;?set;?}}
}

Name 屬性的特性,它就是數據注釋的一種,來自 System.ComponentModel.DataAnnotations 命名空間,這個命名空間中的屬性主要與約束有關。

Required 屬性,說明 Name 字段不能為空;MaxLengh 屬性,限制了數據庫中該列的長度。

Account 類型與 AccountId 屬性的特性,也屬于數據注釋。

不過,它們來自于 System.ComponentModel.DataAnnotations.Schema 命名空間,這個命名空間中的屬性主要與數據庫配置有關。

默認情況下,實體類映射到數據庫中的表名,與上下文類中 DbSet 屬性名有關。

比如 DbSet<Account>,它的屬性名是 Accounts,所以映射到數據庫中的表名就是 Accounts。但是使用了 「Table」 特性就會覆蓋這個默認行為。

「Column」 特性,則可以為 EF Core 提供,該屬性映射到數據庫中的列信息。

如果你想在代碼中使用 Account 類的 Id 屬性,而不是 AccountId,而又想讓它在數據庫中,以 AccountId 字段名表示,那么就需要使用 「Column」 特性。

「Column」 特性中還有其它的一些參數,比如字段的順序與數據庫中的類型等,簡單來說,它可以定義屬性在數據庫中的形式。

Fluent API

Fluent API 是一組方法,這些方法提供了大量的 EF Core 配置選項,用來在上下文類中配置實體。

我們可以在 ApplicationContext 類中,添加這么一段代碼:

protected?override?void?OnModelCreating(ModelBuilder?modelBuilder)
{modelBuilder.Entity<Account>().ToTable("Account");modelBuilder.Entity<Account>().Property(s?=>?s.Id).HasColumnName("AccountId");modelBuilder.Entity<Account>().Property(s?=>?s.Name).IsRequired().HasMaxLength(50);modelBuilder.Entity<Account>().Property(s?=>?s.Age).IsRequired(false);
}

Fluent API 可以在 OnModelCreating 方法中使用,這段配置與前面的數據注釋擁有同樣的效果。

Fluent API 的使用,需要在一開始,就選擇需要配置的實體,然后通過 Property 方法,指定需要添加約束的屬性,其他的方法就很清晰明了了。

OnModelCreating 方法會在 ApplicationContext 類第一次實例化時被調用。也就是在這一刻,所有的三種實體配置方式都會被應用。

由于配置規則非常多,而常用的又并不多,所以更多的配置規則,大家可以通過 EF Core 官方文檔去查閱。

配置方式的選擇

現在,我們主要來說一說,這三種配置方式, 我們應該怎么選擇?

「首先是按約定配置,」這個永遠都是我們的首選。

因為,擁有與表名相同的類名、擁有與命名約定相匹配的主鍵屬性名,以及擁有與列相同的名稱和類型的屬性,是我們的首選。這樣不需要我們做太多的工作。

「然后是數據注釋」,它不僅可以配置實體,最重要的是可以實現數據驗證,如必填或最大長度驗證等,我們應該使用數據注釋,而不是 Fluent API 方法。

原因在于,我們可以很容易的看到,哪個驗證規則與哪個屬性有關,因為它就在屬性的上方,而且具有語義性。另外,數據注釋的驗證,還可以應用在 MVC 中的視圖頁面。

比如在 Account 類中,如果驗證失敗,還可以配置錯誤信息。這種方法會讓我們的驗證代碼更簡單,更容易維護。

「最后是 Fluent API」 ,它用于以上兩種方法以外的情況,比如索引、復合鍵、關系都應該使用 Fluent API。

對于那些我們無法做到的配置,或者當我們想從實體類中隱藏配置時,也必須使用這種方法。

小結

這篇文章主要講了實體屬性的三種配置方式,下篇文章我們將圍繞實體的數據庫遷移與種子數據的填充。

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

bf51c14ca76444d203a0d728ca83ef94.gif

如果喜歡我的文章,那么

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

(戳下面藍字閱讀)

6696200da2350aa145f48f222938a600.png

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

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

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

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

相關文章

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

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

mysql innodb 索引 延遲更新_Mysql覆蓋索引與延遲關聯

延遲關聯&#xff1a;通過使用覆蓋索引查詢返回需要的主鍵,再根據主鍵關聯原表獲得需要的數據。為什innodb的索引葉子節點存的是主鍵&#xff0c;而不是像myisam一樣存數據的物理地址指針&#xff1f;如果存的是物理地址指針不就不需要二次查找了嗎&#xff0c;根據myisam和inn…

Android之在筆記本電腦adb devices識別不了oppo A9手機(設備管理器ADB Interface里面有個黃色感嘆號)

1 問題 記本電腦adb devices識別不了oppo A9手機&#xff08;設備管理器ADB Interface里面有個黃色感嘆號&#xff09; 圖片如下 2 分析 很明顯這里是驅動問題&#xff0c;ADB Interface有感嘆號提示&#xff0c;所以這里需要解決驅動問題 3 解決辦法 1&#xff09;可以嘗試…

《假如編程是魔法之零基礎看得懂的Python入門教程 》——(六)精簡魔法更強大

學習目標 了解對相似邏輯的簡化編寫——循環 推薦 1.《備受好評的看得懂的C語言入門教程》 目錄 第一篇&#xff1a;《假如編程是魔法之零基礎看得懂的Python入門教程 》——&#xff08;一&#xff09;既然你選擇了這系列教程那么我就要讓你聽得懂 第二篇&#xff1a;《假…

Tiny模板語言(VelocityPlus)初步入門

2019獨角獸企業重金招聘Python工程師標準>>> 1 關于用戶手冊 本文主要介紹如何在模板中使用Tiny模板語言&#xff0c;通過查閱本手冊&#xff0c;可以對Tiny模板語言 TTL(Tiny Template Language)的用法有一個較全面的認識&#xff0c;并學會如何有效地使用Tiny模板…

第十二周學習進度表

第十二周所花時間&#xff08;包括上課&#xff09;上課&#xff1a;4小時&#xff08;2小時的實驗&#xff09;&#xff0c;周一&#xff1a;2小時&#xff0c;周三&#xff1a;3小時&#xff0c;周四&#xff1a;2小時&#xff0c;周五&#xff1a;2小時&#xff0c;周六、日…

『技術群里聊些啥』.NET 如何計算文件 MD5 哈希

前言有網友在交流群中詢問&#xff0c;文件 MD5 是全部讀取到內存后計算出來的&#xff0c;還是拿到流就可以計算出來了&#xff1a;原理上來說&#xff0c;MD5 需要對全部內容做運算&#xff0c;所以應該是獲取所有內容后再計算的。但是&#xff0c;如果全部讀取到內存后再計算…

【空間數據庫】ArcGIS地理空間數據庫GeoDatabase(GDB)概述及建立過程圖文詳解

地理數據庫(Geodatabase)是一種面向對象的數據模型,它對于地理空間特征的表達更接近我們對現實世界的認識。地理數據庫在一個公共模型框架下,對GIS處理和表達的空間特征,如適量、柵格、Tin、網絡等進行統一描述和存儲,是目前最先進的數據管理模式,本文介紹地理數據庫的概…

探索發現:平臺云——云的新風向

本文講的是探索發現&#xff1a;平臺云——云的新風向&#xff0c;云主機&#xff0c;自2011年火熱崛起之后&#xff0c;成為IDC行業替代VPS的完美系列&#xff0c;它的成功在于其相對于VPS的壓倒性優勢;而平臺云憑借其的便捷的操作、實時監控和可視化服務&#xff0c;讓站長們…

Android之運行app提示The application could not be installed: INSTALL_FAILED_TEST_ONLY

1、問題 筆記本新安裝的Android studio&#xff08;版本3.5.2&#xff09;運行最簡單的程序&#xff0c;錯誤提示如下 The application could not be installed: INSTALL_FAILED_TEST_ONLY 2、分析 高版本的Android studio里面AndroidManifest.xml文件默認如下 android:tes…

windows下配置mysql主從復制_Windows下MySQL主從復制的配置方法

MySQL主從復制允許將來自一個數據庫(主數據庫)的數據復制到一個或多個數據庫(從數據庫)。主數據庫一般是實時的業務數據寫入和更新操作&#xff0c;從數據庫常用的讀取為主。主從復制過程&#xff1a;1、主服務器上面的任何修改都會通過自己的 I/O tread(I/O 線程)保存在二進制…

【ArcGIS風暴】全國1:100萬基礎地理數據庫獲取及ArcGIS圖幅完美拼接---以甘肅省為例

在日常工作中,如第三次全國國土調查、不動產登記等,我們總需要對圖斑、線狀等數據進行數據分幅、圖幅拼接等操作。另外,日常學習工作中,無論是制圖還是進行分析,都不可避免的需要使用一些基礎地理數據,像行政邊界、水系、道路、居民地等等,那么,這些基礎地理數據有沒有…

體驗 .NET MAUI RC3 ,馬上就要發布RTM

前言.NET MAUI 已經傳了很久了&#xff0c; 5月10日&#xff0c;微軟終于跟隨 VS2022 17.3 預覽版 發布了MAUI的候選版本 &#xff0c;今天我們來體驗一波。環境運行環境&#xff1a;.Net 6開發環境&#xff1a;VS2022 17.3 &#xff08;必須是預覽3&#xff09;使用在安裝了V…

WebApi的調用-3.Basic驗證

webapi里的特性 /// <summary>/// Basic驗證 /// </summary>/// <remarks>/// /// </remarks>public class BasicAuthorizeAttibute : AuthorizeAttribute{public override void OnAuthorization(HttpActionContext actionContext){var authori…

ats 字符集問題

2019獨角獸企業重金招聘Python工程師標準>>> 架構很簡單&#xff0c;nginx->ats->nginx 后端nginx有做內容替換&#xff0c;字符編碼為gb2312&#xff0c;因為ats為utf8編碼導致前端內容展示時進行了錯誤的替換&#xff0c;導致內容錯亂。 如 治療鼻竇炎---&g…

《零基礎看得懂的C語言入門教程 》——(十三)socket服務端編寫

一、學習目標 了解C語言的socket的概念了解C語言socket的使用方法完成C語言socket服務端 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤區 第二篇&#xff1a;&#xff0…

129. Sum Root to Leaf Numbers

/** 129. Sum Root to Leaf Numbers * 2016-5-21 By Mingyang* dfs包含三種&#xff0c;這里是dfs的preorder方法&#xff0c;先解決根再是左右*/public int sumNumbers(TreeNode root) {return dfs(root, 0);}public int dfs(TreeNode root, int levelBase) {if (root null)r…

Android之Unexpected error while executing: am start -n “***.Activity“-a android.intent.action.MAIN

1 問題 編譯項目的時候&#xff0c;as錯誤提示如下 $ adb shell am start -n "package/package.***Activity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER Unexpected error while executing: am start -n "package/package.***Activ…

古董來了:1999年的物件,香港已經回歸了,我都上初中了,那么你出生了嗎?

受疫情的影響&#xff0c;哪都去不了&#xff0c;只能在家憋著&#xff08;為社會做貢獻&#xff09;這種狀態已經持續了將近兩個月了。無聊至極的我&#xff0c;一天無所事事&#xff0c;只能是在家這兒瞅瞅&#xff0c;那兒看看&#xff0c;用一句詩經里面的話來形容我最合適…

.NET性能優化-為結構體數組使用StructLinq

前言本系列的主要目的是告訴大家在遇到性能問題時&#xff0c;有哪些方案可以去優化&#xff1b;并不是要求大家一開始就使用這些方案來提升性能。在之前幾篇文章中&#xff0c;有很多網友就有一些非此即彼的觀念&#xff0c;在實際中&#xff0c;處處都是開發效率和性能之間取…