作為微軟主推的orm框架,ef core具有十分強大的效能,如何構建高效能的ef core專案,請移步我的另一篇部落格: frist是ef core構建資料庫讀寫邏輯的一種方式,微軟官方推薦是code frist模式,但是實際開發中,總是先進行資料庫的設計,才會進行業務邏輯**的編寫,要使用ef core進行運算元據庫,就需要進行反向工程,實際上就是db frist模式。
微軟官方對於分析工程的定義是:反向工程是基架實體型別類的過程,以及基於資料庫架構的 dbcontext 類。 可以使用 ef core 包管理器scaffold-dbcontext
控制台(pmc)工具的命令或 .net 命令列介面(dotnet ef dbcontext scaffold
cli)工具的命令來執行該命令。
一句話就是:基於現有資料庫的模式建立實體類(表名.cs)和派生上下文(庫名context.cs)。實體類是簡單的 c# 物件,表示要查詢和儲存的資料。上下文表示與資料庫的會話,並允許您查詢和儲存實體類的例項。
看看官方怎麼說:
「在進行反向工程之前,你需要安裝pmc 工具(僅適用於 visual studio)或cli 工具。 有關詳細資訊,請參閱鏈結。
還需要為要進行反向工程的資料庫架構安裝適當的資料庫提供程式。」
說白就是:
但是其實,這些在asp.net core 2.2及以上的版本中,在包中已經安裝好了,不需要再進行nuget.
該命令的第乙個引數是指向資料庫的連線字串。 工具將使用此連線字串來讀取資料庫架構。
引號和轉義連線字串的方式取決於您使用哪個 shell 執行命令。 有關詳細資訊,請參閱 shell 的文件。 例如,powershell 要求轉義字元,而不$
\
是。
官方說的很明白,就不解釋了,就是通過乙個連線字串將我們做好的資料庫連線起來。
scaffold-dbcontext 'data source=(localdb)\mssqllocaldb;initial catalog=chinook' microsoft.entityframeworkcore.sqlserver
ps:自己寫寫玩具就不用管這個了
如果有 asp.net core 專案,則可以使用name=
語法從配置中讀取連線字串。
dotnet user-secrets set connectionstrings.chinook "data source=(localdb)\mssqllocaldb;initial catalog=chinook"
dotnet ef dbcontext scaffold name=chinook microsoft.entityframeworkcore.sqlserver
第二個引數是提供程式名稱。 提供程式名稱通常與提供程式的 nuget 包名稱相同。
這裡就是指microsoft.entityframeworkcore.sqlserver
預設情況下,將資料庫架構中的所有表反向工程為實體型別。 您可以通過指定架構和表來限制對哪些表進行反向工程。
pmc-schemas
中的引數和 cli--schema
中的選項可用於包含架構中的每個表。
-tables
(pmc)和--table
(cli)可用於包含特定表。
若要在 pmc 中包括多個表,請使用陣列。
其實就是預設情況下所有的表模型都會對映出來,你非要作一下,專門指定一些表,及按照下面的命令來:
scaffold-dbcontext ... -tables artist, album
預設情況下,表和列名已固定,以便更好地匹配型別和屬性的 .net 命名約定。 如果在-usedatabasenames
pmc 中指定開關或--use-database-names
在 cli 中指定選項,則將禁用此行為,從而盡可能保留原始資料庫名稱。 無效的 .net 識別符號仍然是固定的,而合成的名稱(如導航屬性)仍符合 .net 命名約定。
沒必要作死,給自己找麻煩,預設名稱就好。
預設情況下,實體型別是使用熟知 api 配置的。 如果-dataannotations
可能,請指定--data-annotations
(pmc)或(cli)來改用資料批註。
這塊其實就是模型繫結,新增過濾器,有兩種方法:
dataannotations 與code frist寫法一樣
[required]
[stringlength(160)]
public string title
也可以通過api配置
entity.property(e => e.title)
.isrequired()
.hasmaxlength(160);
預設情況下,基架 dbcontext 類名稱將是以預設值作為字尾的資料庫的名稱。
其實就是 : 資料庫dbcontext
實體類和 dbcontext 類將基架到專案的根目錄中,並使用專案的預設命名空間。 可以使用-outputdir
(pmc)或--output-dir
(cli)來指定基架類的目錄。
這裡就是把生成的「資料庫dbcontext」者玩意放到**的問題,按照mvc的方式,我們一般放到models這樣的資料夾下,一般這樣寫:
scaffold-dbcontext ... -contextdir data -outputdir models
ef core 生成的**是您的**。 隨意更改。 僅當您再次對同一模型進行反向工程時,才會重新生成它。 基架**表示乙個可用於訪問資料庫的模型,但它當然不是唯一可以使用的模型。
根據需要自定義實體型別類和 dbcontext 類。 例如,你可以選擇重新命名型別和屬性、引入繼承層次結構或將表拆分為多個實體。 還可以從模型中刪除非唯一索引、未使用的序列和導航屬性、可選的標量屬性和約束名稱。
還可以新增其他建構函式、方法、屬性等。 在單獨的檔案中使用另乙個分部類。 即使您要再次對模型進行反向工程,此方法也能正常工作。
說人話就是生成的資料庫會話以及實體模型**,也可以更該或者擴充套件。
更改資料庫後,可能需要更新 ef core 模型以反映這些更改。 如果資料庫更改很簡單,只需手動對 ef core 模型進行更改即可。 例如,對錶或列進行重新命名、刪除列或更新列的型別是在**中進行的一些簡單的更改。
但是,更重要的更改並不容易手動完成。 乙個常見的工作流是使用-force
(pmc)或--force
(cli)通過資料庫重寫現有模型,從而將模型從資料庫反向工程。
說白就是當資料庫中的某些引數被修改時,假如只是一些簡單的比如列的名稱變了,我們可以修改一下實體模型以及會話**,但是涉及更複雜的資料庫變動,不如增加一張表,此時將採用 code frist的方式,即模型從資料庫反向工程。
EF Core的基本使用
這種方式就要命令列了 注意 專案中所有的依賴項版本必須一致。第一步 建好專案後通過 nuget 安裝所需依賴項 1 microsoft.entityframeworkcore 核心包,不多說 2 microsoft.entityframeworkcore.design code first 必備包 ...
EFCore中增刪改查的方法
public class efdao idaowhere t class public async taskadd t entity public async taskdelete t entity public async taskupdate t entity public ienumerabl...
利用EF Core的Join進行多表查詢
話說有這麼一家子,老公養了一條狗,老婆養了乙隻貓。人表 寵物表 通過表可以知道,寵物通過owner指向主人的id。問題來了,我要和故事開頭一樣,老公 狗,老婆 貓,對應起來,怎麼查詢呢?有同學說這還不簡單?兩個遍歷一下不就行了。首先 取出 list 寵物 集合,再根據寵物的主人id去查詢對應的主人資...