談談EFCORE的DB Frist模式的使用

2021-10-05 21:51:38 字數 3498 閱讀 8332

作為微軟主推的orm框架,ef core具有十分強大的效能,如何構建高效能的ef core專案,請移步我的另一篇部落格: frist是ef core構建資料庫讀寫邏輯的一種方式,微軟官方推薦是code frist模式,但是實際開發中,總是先進行資料庫的設計,才會進行業務邏輯**的編寫,要使用ef core進行運算元據庫,就需要進行反向工程,實際上就是db frist模式。

微軟官方對於分析工程的定義是:反向工程是基架實體型別類的過程,以及基於資料庫架構的 dbcontext 類。 可以使用 ef core 包管理器scaffold-dbcontext控制台(pmc)工具的命令或 .net 命令列介面(dotnet ef dbcontext scaffoldcli)工具的命令來執行該命令。

一句話就是:基於現有資料庫的模式建立實體類(表名.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 命名約定。 如果在-usedatabasenamespmc 中指定開關或--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去查詢對應的主人資...