還原工程- EF Core | Microsoft Learn
文章推薦指數: 80 %
NET 命令列介面(CLI) 工具的 dotnet ef dbcontext scaffold 命令來執行還原工程。
必要條件. 在進行還原工程之前,您必須先安裝PMC 工具 (僅限Visual ...
跳到主要內容
已不再支援此瀏覽器。
請升級至MicrosoftEdge,以利用最新功能、安全性更新和技術支援。
下載MicrosoftEdge
InternetExplorer和MicrosoftEdge的詳細資訊
目錄
結束焦點模式
閱讀英文
儲存
目錄
閱讀英文
儲存
列印
Twitter
LinkedIn
Facebook
電子郵件
目錄
反向工程
發行項
09/28/2022
1位參與者
本文內容
還原工程是根據資料庫結構描述,Scaffold實體類型類別和DbContext類別的流程。
您可以使用EFCore套件管理員主控台(PMC)工具的Scaffold-DbContext命令,或.NET命令列介面(CLI)工具的dotnetefdbcontextscaffold命令來執行還原工程。
必要條件
在進行還原工程之前,您必須先安裝PMC工具(僅限VisualStudio)或CLI工具。
如需詳細資訊,請參閱連結。
在您要Scaffold至的專案中安裝Microsoft.EntityFrameworkCore.Design適用的NuGet套件。
您也必須為要進行還原工程的資料庫結構描述,安裝適當的資料庫提供者。
連接字串
命令的第一個引數是資料庫的連接字串。
這些工具會使用此連接字串來讀取資料庫結構描述。
您引用和逸出連接字串的方式,取決於您用來執行命令的殼層。
如需詳細資訊,請參閱您的殼層文件。
例如,PowerShell會要求您逸出$字元,而非\。
.NETCoreCLI
VisualStudio
dotnetefdbcontextscaffold"DataSource=(localdb)\MSSQLLocalDB;InitialCatalog=Chinook"Microsoft.EntityFrameworkCore.SqlServer
Scaffold-DbContext'DataSource=(localdb)\MSSQLLocalDB;InitialCatalog=Chinook'Microsoft.EntityFrameworkCore.SqlServer
組態和使用者祕密
如果您具備使用裝載模型和組態系統的.NET應用程式(例如ASP.NETCore專案)則可以使用Name=
這適用於祕密管理員工具,讓您的資料庫密碼可與程式碼基底分開。
dotnetuser-secretsinit
dotnetuser-secretssetConnectionStrings:Chinook"DataSource=(localdb)\MSSQLLocalDB;InitialCatalog=Chinook"
dotnetefdbcontextscaffoldName=ConnectionStrings:ChinookMicrosoft.EntityFrameworkCore.SqlServer
提供者名稱
第二個引數是提供者名稱。
提供者名稱通常會與提供者的NuGet套件名稱相同。
指定資料表
資料庫結構描述中的所有資料表,預設都可進行還原工程為實體類型。
您可以指定結構描述和資料表,藉此限制要對哪些資料表進行還原工程。
.NETCoreCLI
VisualStudio
--schema選項可用來包含結構描述中的每個資料表,而--table可用來包含特定資料表。
若要包含多個資料表,請指定多次選項:
dotnetefdbcontextscaffold...--tableArtist--tableAlbum
-Schemas選項可用來包含結構描述中的每個資料表,而-Tables可用來包含特定資料表。
若要包含多個資料表,請使用陣列:
Scaffold-DbContext...-TablesArtist,Album
保留名稱
資料表和資料行名稱預設會進行修正,以更符合類型和屬性的.NET命名慣例。
在PMC中指定-UseDatabaseNames切換,或在.NETCoreCLI中指定--use-database-names選項將會停用此行為,盡可能保留原始資料庫名稱。
此外,無效的.NET識別碼仍會進行修正,而導覽屬性等合成名稱仍會符合.NET命名慣例。
FluentAPI或資料註解
實體類型預設透過FluentAPI進行設定。
指定-DataAnnotations(PMC)或--data-annotations(.NETCoreCLI),以盡可能使用資料註解。
例如,使用FluentAPI會Scaffold下列內容:
entity.Property(e=>e.Title)
.IsRequired()
.HasMaxLength(160);
而使用資料註解則會Scaffold下列內容:
[Required]
[StringLength(160)]
publicstringTitle{get;set;}
DbCoNtext名稱
Scaffold的DbCoNtext類別名稱,預設會是在後面加上Context的資料庫名稱。
若要指定不同的名稱,請在PMC中使用-Context,以及在.NETCoreCLI中使用--context。
目錄和命名空間
實體類別和DbCoNtext類別會Scaffold到專案的根目錄中,並使用專案的預設命名空間。
.NETCoreCLI
VisualStudio
您可以使用--output-dir指定類別的Scaffold位置所在目錄,而--context-dir可用來將DbCoNtext類別Scaffold到與實體類型類別不同的目錄:
dotnetefdbcontextscaffold...--context-dirData--output-dirModels
命名空間預設會是根命名空間加上專案根目錄下任何子目錄的名稱。
不過,從EFCore5.0開始,您可以使用--namespace針對所有輸出類別覆寫命名空間。
您也可以使用--context-namespace,只針對DbCoNtext類別覆寫命名空間:
dotnetefdbcontextscaffold...--namespaceYour.Namespace--context-namespaceYour.DbContext.Namespace
您可以使用-OutputDir指定類別的Scaffold位置所在目錄,而-ContextDir可用來將DbCoNtext類別Scaffold到與實體類型類別不同的目錄:
Scaffold-DbContext...-ContextDirData-OutputDirModels
命名空間預設會是根命名空間加上專案根目錄下任何子目錄的名稱。
不過,從EFCore5.0開始,您可以使用-Namespace針對所有輸出類別覆寫命名空間。
您也可以使用-ContextNamespace,只針對DbCoNtext類別覆寫命名空間。
Scaffold-DbContext...-NamespaceYour.Namespace-ContextNamespaceYour.DbContext.Namespace
運作方式
還原工程會從讀取資料庫結構描述開始。
其會讀取資料表、資料行、條件約束和索引的相關資訊。
接著,還原工程會使用結構描述的資訊來建立EFCore模型。
資料表會用於建立實體類型;資料行用於建立屬性;而外部索引鍵或用於建立關聯性。
最後,模型會用於產生程式碼。
為了重新建立與您應用程式相同的模型,會Scaffold對應的實體類型類別、FluentAPI和資料註解。
限制
模型的相關項目無法全部都使用資料庫結構描述來表示。
例如,繼承階層、擁有的類型和資料表分割的相關資訊並不會出現在資料庫結構描述中。
因此,這些建構無法進行還原工程。
此外,EFCore提供者可能不支援部分資料行類型。
這些資料行不會包含在模型中。
您可以在EFCore模型中定義並行權杖,以防止有兩個使用者同時更新相同的實體。
部分資料庫具備可代表此資料行類型(例如SQLServer中的rowversion)的特殊類型,在此情況中,我們可以對此資訊進行還原工程,但不會對並行權杖進行還原工程。
在EFCore6之前,還原工程並不支援C#8可為Null的參考型別功能:EFCore一律會產生假設此功能已停用的C#程式碼。
例如,可為Null的文字資料行會Scaffold為具備類型string(而非string?)的屬性,並使用FluentAPI或資料註解來設定屬性是否為必要。
如果您使用的是舊版EFCore,您依然可以編輯Scaffold程式碼,並以C#可Null性註解取代這些程式碼。
自訂模型
EFCore所產生的程式碼就是您的程式碼,您可隨意進行變更。
只有在您對相同的模型再次進行還原工程時,該程式碼才會重新產生。
Scaffold程式碼代表「一個」可用來存取資料庫的模型,但並非「唯一」可使用的模型。
您可以自訂實體類型類別和DbCoNtext類別,以符合您的需求。
例如,您可以選擇重新命名類型和屬性、引進繼承階層,或將資料表分割成多個實體。
您也可以從模型中移除非唯一索引、未使用的序列和導覽屬性、選用純量屬性和條件約束名稱。
您也可以在不同的檔案中使用另一個部分類別,藉此新增其他建構函式、方法、屬性等。
即使您想要對模型再次進行還原工程,仍可使用此方法。
從EF7開始,您也可以使用T4文字範本來自訂產生的程式碼。
如需詳細資訊,請參閱自訂還原工程範本。
更新模型
對資料庫進行變更之後,您可能需要更新EFCore模型以反映這些變更。
如果要對資料庫進行簡易變更,最簡單的方式就是手動變更EFCore模型。
例如,重新命名資料表或資料行、移除資料行或更新資料行的類型,這些在程式碼中都是簡單變更。
不過,若變更較為重大,就不容易透過手動的方式進行。
其中一個常見的工作流程是使用-Force(PMC)或--force(CLI),從資料庫對模型再次進行還原工程,將現有的模型覆寫為更新後的模型。
另一個常受到要求的功能是能夠從資料庫更新模型,並同時保留重新命名、類型階層等自訂。
您可以使用問題#831來追蹤此功能的進度。
警告
如果您從資料庫再次對模型進行還原工程,您對檔案所做的任何變更都將遺失。
提示
如果您使用VisualStudio,EFCorePowerTools社群延伸模組(這是以EFCore命令列工具為基礎建置的圖形化工具)可提供額外的工作流程和自訂選項。
本文內容
延伸文章資訊
- 17.2.2 Scaffolding an Existing Database in EF Core
dotnet ef dbcontext scaffold "connection-string" MySql.EntityFrameworkCore -o sakila -f. To valid...
- 2Scaffolding in Razor Pages
- 3Entity Framework Core with Existing Database
- 4還原工程- EF Core | Microsoft Learn
NET 命令列介面(CLI) 工具的 dotnet ef dbcontext scaffold 命令來執行還原工程。 必要條件. 在進行還原工程之前,您必須先安裝PMC 工具 (僅限Visual...
- 5NET Core第10天_搭配EF Core串聯資料庫Db First - iT 邦幫忙
#warning To protect potentially sensitive information in your connection string, you should move ...