第四單元 管理資料庫架構

来源:https://www.cnblogs.com/xuyubing/archive/2023/12/11/17894832.html
-Advertisement-
Play Games

EF Core 提供兩種主要方法來保持 EF Core 模型和資料庫架構同步。至於我們應該選用哪個方法,請確定你是希望以 EF Core 模型為準還是以資料庫為準。 如果希望以 EF Core 模型為準,請使用遷移。 對 EF Core 模型進行更改時,此方法會以增量方式將相應架構更改應用到資料庫, ...


EF Core 提供兩種主要方法來保持 EF Core 模型和資料庫架構同步。至於我們應該選用哪個方法,請確定你是希望以 EF Core 模型為準還是以資料庫為準。

  1. 如果希望以 EF Core 模型為準,請使用遷移。 對 EF Core 模型進行更改時,此方法會以增量方式將相應架構更改應用到資料庫,以使資料庫保持與 EF Core 模型相容(CodeFirst,小項目用這種)。

  2. 如果希望以資料庫架構為準,請使用反向工程。 使用此方法,可通過將資料庫架構反向工程到 EF Core 模型來生成相應的 DbContext 和實體類型(DbFirst,中大型項目建議使用)。

 

1. 數據遷移

在實際項目中,數據模型隨著功能的實現而變化:添加和刪除新的實體或屬性,並且需要相應地更改資料庫架構,使其與應用程式保持同步。 EF Core 中的遷移功能能夠以遞增方式更新資料庫架構,使其與應用程式的數據模型保持同步,同時保留資料庫中的現有數據。

簡要地說,遷移的方式如下:

  • 當引入數據模型更改時,開發人員使用 EF Core 工具添加相應的遷移,以描述使資料庫架構保持同步所需的更新。EF Core 將當前模型與舊模型的快照進行比較,以確定差異,並生成遷移源文件;文件可在項目的源代碼管理中進行跟蹤,如任何其他源文件。

  • 生成新的遷移後,可通過多種方式將其應用於資料庫。 EF Core 在一個特殊的歷史記錄表中記錄所有應用的遷移,使其知道哪些遷移已應用,哪些遷移尚未應用。

 

安裝工具

首先,必須安裝 EF Core 命令行工具

  • 我們通常建議使用 .NET Core CLI 工具,該工具適用於所有平臺。

    # 安裝
    dotnet tool install -g --version 6.0.4 dotnet-ef
    
    # 更新
    dotnet tool update --global dotnet-ef --version 6.0.7
    
    # 在將工具用於特定項目之前,需要將 Microsoft.EntityFrameworkCore.Design 添加到該項目中。
    dotnet add package Microsoft.EntityFrameworkCore.Design --version 6.0.4
    dotnet add package Microsoft.EntityFrameworkCore.Tools --version 6.0.4
    # 驗證
    dotnet ef
    
    _/\__
                   ---==/    \\
             ___  ___   |.    \|\
            | __|| __|  |  )   \\\
            | _| | _|   \_/ |  //|\\
            |___||_|       /   \\\/\\
    
    Entity Framework Core .NET Command-line Tools 2.1.3-rtm-32065
    
    <Usage documentation follows, not shown.>

     

    常用選項

    選項Short說明
    --json   顯示 JSON 輸出。
    --context <DBCONTEXT> -c 要使用的 DbContext 類。 僅類名或完全限定命名的空間。 如果省略此選項,EF Core 將查找上下文類。 如果有多個上下文類,則此選項是必需的。
    --project <PROJECT> -p 目標項目的項目文件夾的相對路徑。 預設值是當前文件夾。
    --startup-project <PROJECT> -s 啟動項目的項目文件夾的相對路徑。 預設值是當前文件夾。
    --framework <FRAMEWORK>   目標框架目標框架名字對象。 當項目文件指定了多個目標框架,並且你想要選擇其中一個目標框架時,請使用此選項。
    --configuration <CONFIGURATION>   生成配置,例如 DebugRelease
    --runtime <IDENTIFIER>   要為其還原包的目標運行時的標識符。 有關運行時標識符 (RID) 的列表,請參閱 RID 目錄
    --no-build   請勿生成項目。 旨在在生成處於最新狀態時使用。
    --help -h 顯示幫助信息。
    --verbose -v 顯示詳細輸出。
    --no-color   請勿為輸出著色。
    --prefix-output   具有級別的首碼輸出。
  • 如果你更喜歡在 Visual Studio 內工作或你具有 EF6 遷移經驗,還可以使用程式包管理器控制台工具

    # 安裝
    Install-Package Microsoft.EntityFrameworkCore.Tools
    
    # 更新
    Update-Package Microsoft.EntityFrameworkCore.Tools
    
    # 驗證安裝
    Get-Help about_EntityFrameworkCore
    
    _/\__
                   ---==/    \\
             ___  ___   |.    \|\
            | __|| __|  |  )   \\\
            | _| | _|   \_/ |  //|\\
            |___||_|       /   \\\/\\
    
    ......

     

    通用參數

    下表顯示了所有 EF Core 命令的通用參數:

    參數說明
    -Context <String> 要使用的 DbContext 類。 僅類名或完全限定命名的空間。 如果省略此參數,EF Core 將查找上下文類。 如果有多個上下文類,則此參數是必需的。
    -Project <String> 目標項目。 如果省略此參數,則包管理器控制台的預設項目將用作目標項目。
    -StartupProject <String> 啟動項目。 如果省略此參數,則解決方案屬性中的啟動項目將用作目標項目。
    -Args <String> 傳遞給應用程式的參數。 已在 EF Core 5.0 中添加。
    -Verbose 顯示詳細輸出。

創建第一個遷移

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
}

 

你現在已準備好添加第一個遷移! 指示 EF Core 創建名為 InitialCreate 的遷移:

.NET CLI

dotnet ef migrations add InitialCreate

 

VisualStudio

Add-Migration InitialCreate

 

 

EF Core 將在項目中創建一個名為“Migrations”的目錄,並生成一些文件。 最好檢查 EF Core 生成的內容,併在可能的情況下修改它,但現在我們跳過此操作。

創建資料庫和架構

此時,可以讓 EF 創建資料庫並從遷移中創建架構。 可以通過以下操作實現這一點:

 

.NET CLI

dotnet ef database update

 

VisualStudio

Update-Database

 

就是這麼回事 - 你的應用程式已準備好在新資料庫上運行,你無需編寫任何 SQL 代碼。 請註意,這種應用遷移的方法非常適合本地開發,但不太適用於生產環境 - 有關詳細信息,請參閱應用遷移頁面

 

發展模型

幾天後,系統會要求你將創建時間戳添加到博客。 你已完成針對應用程式的必要更改,模型現在如下所示:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedTimestamp { get; set; }
}

 

模型和生產資料庫現在不同步,我們必須向資料庫架構中添加一個新列。 讓我們為此創建新遷移:

 

.NET CLI

dotnet ef migrations add AddBlogCreatedTimestamp

 

VisualStudio

Add-Migration AddBlogCreatedTimestamp

 

 

請註意,我們為遷移提供了一個描述性名稱,以便以後更容易瞭解項目歷史記錄。

由於這不是項目的第一次遷移,EF Core 現在會在添加列之前將更新的模型與舊模型的快照進行比較;模型快照是 EF Core 在你添加遷移時生成的文件之一,並簽入到源代碼管理中。 基於該比較,EF Core 檢測到已添加一列,並添加適當的遷移。

現在,你可以像以前一樣應用遷移:

.NET CLI

dotnet ef database update

 

VisualStudio

Update-Database

 

請註意,這次 EF 檢測到資料庫已存在。 此外,在之前第一次應用遷移時,此事實記錄在資料庫中的特殊遷移歷史記錄表中;這允許 EF 自動僅應用新的遷移。

 

排除模型的各個部分

備註

EF Core 5.0 中已引入此功能。

有時,你可能希望引用其他 DbContext 中的類型(表)。 這可能會導致遷移衝突。 若要防止出現這種情況,請從 DbContext 之一的遷移中排除該類型。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<IdentityUser>()
        .ToTable("AspNetUsers", t => t.ExcludeFromMigrations());
}

 

 

命名空間

可以手動移動 Migrations 文件並更改其命名空間。 新建的遷移和上個遷移同級。 或者,可以在生成時指定目錄,如下所示:

.NET CLI

dotnet ef migrations add InitialCreate --output-dir Your/Directory

 

VisualStudio

Add-Migration InitialCreate -OutputDir Your\Directory

 

在 EF Core 5.0 中,你還可以使用 -Namespace 獨立於目錄更改命名空間。

刪除遷移

有時,你可能在添加遷移後意識到需要在應用遷移前對 EF Core 模型作出其他更改。 要刪除上個遷移,請使用如下命令。

如果遷移已被應用(執行了 database update),則無法使用remove。

.NET CLI

dotnet ef migrations remove

 

VisualStudio

Remove-Migration

 

列出遷移

你可以列出現有的所有遷移,如下所示:

.NET CLI

dotnet ef migrations list

 

VisualStudio

Get-Migration

 

 

重置所有遷移

在某些極端情況下,可能需要刪除所有遷移並重新開始。 這可以通過刪除 Migrations 文件夾並刪除資料庫來輕鬆完成;此時,你可以創建一個新的初始遷移,其中將包含當前的整個架構。

你還可以重置所有遷移並創建單個遷移,而不會丟失數據。 此操作有時稱為“更正”,涉及一些手動操作:

  • 刪除 Migrations 文件夾

  • 創建新遷移併為其生成 SQL 腳本

  • 在資料庫中,刪除遷移歷史記錄表中的所有行

  • 在遷移歷史記錄中插入一行,以記錄第一個遷移已經應用,因為表已經存在。 insert SQL 是上面生成的 SQL 腳本中的最後一個操作(在我們刪除了Migrations文件夾中所有的遷移文件以及刪除完_efmigrationshistory表中的記錄之後,再執行一次migrations add 的命令,表示重新添加一條記錄,然後不要執行database update 命令,最後再把剛剛遷移生成的記錄添加至__efmigrationshistory 表中)。

警告

刪除 Migrations 文件夾後,所有自定義遷移代碼都將丟失。 若要保留任何自定義項,必須手動將其應用到新的初始遷移。

 

2. 應用遷移

添加遷移後,需要將其部署並應用到資料庫。 有多種策略可用於執行此操作,其中一些更適合生產環境,而另一些更適合開發生命周期。

備註

無論部署策略是什麼,都應檢查生成的遷移併進行測試,然後再將其應用於生產資料庫。 遷移可能會在意圖是對列進行重命名時刪除該列,或者在應用於資料庫時因各種原因而失敗。

SQL 腳本

建議通過生成 SQL 腳本,將遷移部署到生產資料庫。 此策略的優點包括:

  • 可以檢查 SQL 腳本的準確性;這一點很重要,因為將架構更改應用於生產資料庫是一項可能導致數據丟失的潛在危險操作。

  • 在某些情況下,可以根據生產資料庫的特定需求調整這些腳本。

  • SQL 腳本可以與部署技術結合使用,甚至可以在 CI 過程中生成。

  • SQL 腳本可以提供給 DBA,並且可以單獨管理和存檔。

基本用法

以下命令將生成一個從空白資料庫到最新遷移的 SQL 腳本:

.NET CLI

dotnet ef migrations script

 

VisualStudio

Script-Migration

 

 

3. 反向工程

反向工程是基於資料庫架構搭建實體類型類和 DbContext 類基架的過程。 可使用 EF Core 包管理器控制台 (PMC) 工具的 Scaffold-DbContext 命令或 .NET 命令行介面 (CLI) 工具的 dotnet ef dbcontext scaffold 命令執行這一過程。

先決條件

  • 在進行反向工程之前,需要安裝 PMC 工具(僅限 Visual Studio)或 CLI 工具。 有關詳細信息,請參閱鏈接。

  • 在要搭建基架的項目中安裝 Microsoft.EntityFrameworkCore.Design 的 NuGet 包。

  • 還需要為要進行反向工程的資料庫架構安裝適當的資料庫提供程式

連接字元串

該命令的第一個參數是指向資料庫的連接字元串。 工具將使用此連接字元串來讀取資料庫架構。

引用和轉義連接字元串的方式取決於用於執行命令的 shell。 有關詳細信息,請參閱 shell 的文檔。 例如,PowerShell 要求轉義 $ 字元,而不是 \

.NET CLI

dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer

 

VisualStudio

Scaffold-DbContext 'Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook' Microsoft.EntityFrameworkCore.SqlServer
 

 

指定表

預設情況下,將資料庫架構中的所有表反向工程為實體類型。 可通過指定架構和表來限制對哪些表進行反向工程。

.NET CLI

--schema 選項可用於包含架構中的每個表,而 --table 可用於包含特定表。

若要包含多個表,請多次指定選項:

dotnet ef dbcontext scaffold ... --table Artist --table Album

 

VisualStudio

-Schemas 選項可用於包含架構中的每個表,而 -Tables 可用於包含特定表。

若要包含多個表,請使用數組:

Scaffold-DbContext ... -Tables Artist, Album

 

保留名稱

預設情況下,表和列名已修正,以便更好地匹配類型和屬性的 .NET 命名約定。 在 PMC 中指定 -UseDatabaseNames 開關或在 .NET Core CLI 中指定 --use-database-names 選項將禁用此行為,從而儘可能保留原始資料庫名稱。 無效的 .NET 標識符仍將被修正,而合成名稱(如導航屬性)仍將符合 .NET 命名約定。

 

DbContext 名稱

預設情況下,已搭建基架的 DbContext 類名稱將是尾碼為 Context 的資料庫名稱。 若要指定不同名稱,請在 PMC 中使用 -Context,在 .NET Core CLI 中使用 --context

目錄和命名空間

實體類和 DbContext 類將搭建到項目的根目錄中,並使用項目的預設命名空間。

.NET CLI

可使用 --output-dir 指定在其中為類搭建基架的目錄,並且可使用 --context-dir 將 DbContext 類搭建到與實體類型類不同的目錄中:

dotnet ef dbcontext scaffold ... --context-dir Data --output-dir Models

 

預設情況下,命名空間將是根命名空間加上項目根目錄下任何子目錄的名稱。 但是,從 EFCore 5.0 開始,可使用 --namespace 覆蓋所有輸出類的命名空間。 還可使用 --context-namespace 僅覆蓋 DbContext 類的命名空間:

dotnet ef dbcontext scaffold ... --namespace Your.Namespace --context-namespace Your.DbContext.Namespace

 

 

VisualStudio

可使用 -OutputDir 指定在其中為類搭建基架的目錄,並且可使用 -ContextDir 將 DbContext 類搭建到與實體類型類不同的目錄中:

Scaffold-DbContext ... -ContextDir Data -OutputDir Models

 

預設情況下,命名空間將是根命名空間加上項目根目錄下任何子目錄的名稱。 但是,從 EFCore 5.0 開始,可使用 -Namespace 覆蓋所有輸出類的命名空間。 還可使用 -ContextNamespace 僅覆蓋 DbContext 類的命名空間。

Scaffold-DbContext ... -Namespace Your.Namespace -ContextNamespace Your.DbContext.Namespace

 

 

配套視頻鏈接:課程簡介 (cctalk.com)

 

 

海闊平魚躍,天高任我行,給我一片藍天,讓我自由翱翔。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.定義 SPI(Service Provider Interface) 是一種面向介面編程的技術,它可以讓一個程式根據介面約定規範自動發現和載入對應的實現類。它是一種 Java 種的介面編程規範,它定義了介面和服務提供者之間的約定規範,使得在運行時動態載入實現該介面的類。SPI 機制是通過在服務提 ...
  • 合併Excel可以將多個文件中的數據合併到一個文件中,這樣可以幫助我們更好地彙總和管理數據。日常工作中,合併Excel主要有以下兩種需求: 將多個Excel文件合併為一個文件 將多個Excel工作表合併為一個工作表 這篇文章將介紹如何使用第三方Python庫 Spire.XLS for Python ...
  • Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹`QPushButton`按鈕組件的常用方法及靈活運用。QPushButton 是 Qt 框架中用於創建按鈕的組件... ...
  • 簡述springMVC工作流程 Spring MVC是一個基於Java的開源MVC框架,用於構建Web應用程式。它通過將應用程式分解為模型(Model)、視圖(View)和控制器(Controller)三個部分,以提高應用程式的可維護性和可擴展性。以下是Spring MVC的基本工作流程: 客戶端發 ...
  • 來源:https://www.163.com/dy/article/G9K7V11T05373SPQ.html 今天在地鐵認識一個女(碩士),我邀請她來我公司面試,她要求15000一個月,聽她說被外包公司騙了,合同都是套路,被裁員後只獲得4000元的賠償,就這個舉動,我感覺她是一個職場小白,我看她學 ...
  • 一.什麼是Tomact? Tomcat是一個開源免費的輕量級Web伺服器,它是一個軟體程式,主要功能是提供網上信息瀏覽服務,對HTTP協議的操作進行封裝,使得程式員不必對協議進行操作,讓Web開發更加便捷。 Tomcat官網 二.Tomcat的安裝 註意:由於Tomcat依賴Java,請在Tomca ...
  • PlayEdu —— 一個適用於搭建企業內部培訓平臺的開源系統。採用前後端分離的模式,後端基於 Java + SpringBoot3 + MySQL 開發,前端採用 React18 為核心框架。 ...
  • 在Qt中,信號與槽(Signal and Slot)是一種用於對象之間通信的機制。是Qt框架引以為傲的一項機制,它帶來了許多優勢,使得Qt成為一個強大且靈活的開發框架之一。信號與槽的關聯通過`QObject::connect`函數完成。這樣的機制使得對象能夠以一種靈活而鬆散耦合的方式進行通信,使得組... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...