asp.net core系列 31 EF管理資料庫架構--必備知識 反向工程

来源:https://www.cnblogs.com/MrHSR/archive/2019/02/25/10425437.html
-Advertisement-
Play Games

一. 反向工程 反向工程是基於資料庫架構,生成的實體類和DbContext類代碼的過程,對於Visual Studio開發,建議使用PMC。對於其他開發環境,請選擇.NET Core CLI工具(跨平臺)。 (1) 在程式包管理器控制台(PMC)工具中使用命令Scaffold-DbContext 來 ...


一.   反向工程

  反向工程是基於資料庫架構,生成的實體類和DbContext類代碼的過程,對於Visual Studio開發,建議使用PMC。對於其他開發環境,請選擇.NET Core CLI工具(跨平臺)。

    (1) 在程式包管理器控制台(PMC)工具中使用命令Scaffold-DbContext 來進行反向工程。

    (2) 在.NET 命令行介面 (CLI) 工具中使用dotnet ef dbcontext scaffold命令來進行反向工程。

  

   1.1 Scaffold-DbContext介紹

    使用Scaffold-DbContext命令生成實體類型時,資料庫表必須具有主鍵,沒有主鍵的表不會被反向工程。下麵是PMC下的參數表格介紹,對於CLI的scaffold參數介紹參考官網

         參數

描述

-Connection <String> 資料庫的連接字元串。該參數,是必需的。
-Provider <String> 要使用的提供程式。通常,這是NuGet包的名稱,例如:Microsoft.EntityFrameworkCore.SqlServer。該參數,是必需的。
-OutputDir <String> 放入文件的目錄。路徑是相對於項目目錄的。
-ContextDir <String> 放置DbContext文件的目錄。路徑是相對於項目目錄的。
-Context <String> DbContext要生成的類的名稱。
-Schemas <String []> 用於生成實體類型的表的架構。如果省略此參數,則包括所有架構。例如在sqlserver上預設dbo架構
-Tables <String []> 用於生成實體類型的表。如果省略此參數,則包括所有表。
-DataAnnotations 使用屬性配置模型(如果可能)。如果省略此參數,則僅使用fluent API。

-UseDatabaseNames

使用與資料庫中顯示的完全相同的表和列名稱。如果省略此參數,則更改資料庫名稱以更符合C#名稱樣式約定。
-Force 覆蓋現有文件

 

二. 命令參數詳解

  2.1 必備參數

    -Connection <String>是第一個參數是資料庫的連接字元串。 工具將使用此連接字元串來讀取資料庫架構。-Provider <String>是提供程式名稱。

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

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

    

   2.2 指定表和架構

    預設情況下,資料庫架構中的所有表都被反向工程到實體類型,可以限制哪些表是反向工程,處理通過指定架構和表。

      -Schemas在 PMC 中的參數和—schema CLI 中的選項可用於包含在架構中的每個表。    

      -Tables (PMC) 和--table(CLI) 可用於包括特定的表。

    若要在 PMC 中包含多個表,使用一個數組。若要在 CLI 中包含多個表,請多次指定選項。

    // PowerShell
    Scaffold-DbContext ... -Tables Blog, Post

    // dotnet
    dotnet ef dbcontext scaffold ... --table Blog --table Post

   

  2.3 保留名稱

          預設情況下,資料庫的表名稱和列名稱是固定的,以便更好地匹配實體名稱和屬性名稱的.NET命名約定。在PMC中指定 -UseDatabaseNames或在CLI中指定 --use-database-names使數據模型中的實體名稱和屬性名稱與資料庫中顯示的的表和列名稱完全相同。如果省略此參數,則可能會更改名稱以更符合C#命名約定。

 

  2.4 Fluent API 或數據註釋

     預設情況下,使用Fluent API配置實體類型。在PMC中指定-DataAnnotations或在CLI中指定 --data-annotations的情況下使用數據註釋。下麵二個代碼塊, 一個是使用Fluent API配置的,一個是使用數據註釋,二者實現功能上一樣。

        //Fluent API配置
        entity.Property(e => e.Title)
            .IsRequired()
        .HasMaxLength(160);

         //數據註釋
        [Required]
        [StringLength(160)]
        public string Title { get; set; }

 

  2.5 DbContext 名稱 

     預設情況下,DbContext 上下文名稱是(資料庫名+ Context尾碼) 若要自定義一個DbContext 上下文名稱,在PMC中指定 -Context或在CLI中指定--context

 

  2.6 目錄和命名空間

     預設情況下,實體類和DbContext類被搭建到項目的根目錄中,並使用項目的預設命名空間。在PMC中指定-OutputDir或在CLI中指定--output-dir指定目錄。命名空間將是根命名稱+子目錄的名稱。

              下麵使用-ContextDir(PMC) 和--context-dir(CLI) 來創建到一個單獨的目錄(Models),存放實體類和DbContext 類。

        // PowerShell
        Scaffold-DbContext ... -ContextDir Data -OutputDir Models
// dotnet dotnet ef dbcontext scaffold ... --context-dir Data --output-dir Models

 

  2.7 更新模型

    當更改資料庫後,可能需要更新EF Core模型以反映這些更改。如果資料庫更改很簡單,則最簡單的方法是手動對EF Core模型進行更改。例如,重命名錶或列,刪除列或更新列的類型是在代碼中進行的微不足道的更改。如果,資料庫更改動作大。一個常見的工作流程是使用-Force(PMC)或--force(CLI)再次從資料庫對模型進行反向工程,以使用更新的模型覆蓋現有模型。

 

三.演示

   3.1 初始化反向工程    

    下麵來演示一下,關於準備工作和反向工程註意事項這裡不在說明,請參考“asp.net core 系列 21 EF現有資料庫進行反向工程”。

    本篇使用Visual Studio開發,使用Package Manager Console工具來進行反向工程管理,用PowerShell腳本,並附帶上跨平臺管理 的dotnet命令,基於EFGetStarted.AspNetCore.NewDb資料庫,包括:Blogs和Posts表來演示反向工程。如下圖所示:

      

PM> Scaffold-DbContext   "Data Source ={ip};Initial Catalog = EFGetStarted.AspNetCore.NewDb; User ID = hsr;Password =js*2015;" Microsoft.EntityFrameworkCore.SqlServer 
-OutputDir Models -Tables Blogs -Context ReverseDbContext -DataAnnotations -UseDatabaseNames

    上面的一串命令參數中,除了資料庫的連接字元串、使用的提供程式、放入文件的目錄,其它參數都是可選的。 命令執行成功後,將把DbContext 上下文和實體類(Blogs)存放到Models文件夾中。  使用了 -Context自定義DbContext 上下文、-DataAnnotations數據註釋代替Fluent API配置、 -UseDatabaseNames與資料庫中顯示的的表和列名稱完全相同。

        

  

   3.2 更新模型

    下麵將Blogs表的Url欄位類型長度從Max改為400,新增了Address欄位,使用-Force來覆蓋現有文件。命令成功後,查看Blogs實體。 

PM> Scaffold-DbContext   "Data Source =172.168.16.75;Initial Catalog = EFGetStarted.AspNetCore.NewDb; User ID = hsr;Password =js*2015;" Microsoft.EntityFrameworkCore.SqlServer   
-OutputDir Models -Tables Blogs -Context ReverseDbContext -DataAnnotations -UseDatabaseNames -Force

 

四. 其它說明

   4.1 反向工程工作原理

                  (1) 反向工程開始時讀取資料庫架構。 它將讀取有關表、 列、 約束和索引的信息。

                  (2) 接下來,它使用的架構信息創建 EF Core 模型。 使用表來創建實體類型;使用列來創建屬性;和外鍵用於創建關係。

                  (3) 最後,該模型用於生成代碼。 相應的實體類型的類、 Fluent API 和數據批註已搭建基架以重新創建相同的模型從您的應用程式中。

 

  4.2 反向工程哪些不起作用

    (1) 並非所有關於模型的內容都可以使用資料庫架構來表示。 例如:有關繼承層次結構,擁有類型,表拆分等不存在於資料庫架構中。 因此,這些構造將永遠不能反向工程處理。

此外,EF Core提供程式可能不支持某些列類型。這些列不會包含在模型中。

    (2) EF Core需要每個實體類型有一個主鍵。  表沒有主鍵是會反向工程。

    (3) 您可以定義併發標記EF Core 模型以防止兩個用戶在同一時間更新同一實體中。 有些資料庫可以代替這種併發衝突,例如SQL Server 中的行版本控制。但是這也不能反向工程處理。

   

  4.3 反向工程自定義模型

     EF Core生成的代碼可隨意改變它。只有再次對同一模型進行反向工程時,才會重新生成它。Scaffold代碼代表一個可用於訪問資料庫的模型,但它肯定不是唯一可以使用的模型。

    可以自定義實體類和DbContext類以滿足您的需要。例如,可以選擇重命名類型和屬性,引入繼承層次結構或將表拆分為多個實體。您還可以從模型中刪除非唯一索引,未使用的序列和導航屬性,可選標量屬性和約束名稱。還可以在單獨的文件中使用另一個partial 類添加其他構造函數,方法,屬性等。即使您打算再次對模型進行逆向工程,這種方法仍然有效。

 

  參考文獻

     EF反向工程


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 實例中,可以通過person中的不同類型的對象來實現不同的方法。 ...
  • 企業微信的支付自從企業號變化為企業微信後,增加了一些支付介面以及對很多介面進行了調整,企業微信的支付處理也是變化了不少,往往有時候碰到不少坑,一步一個腳印趟過來的;企業微信支付是需要結合微信商戶後臺進行處理,有時候也需要設置好商戶平臺的相關處理,才能進行發送紅包、支付到個人等等支付處理。本篇隨筆介紹... ...
  • 錯誤實例一:父類的訪問性低於子類 錯誤實例二:方法的訪問修飾符需要和參數的類型的訪問修飾符一致 類似的問題都是可訪問性不一致造成的,修改訪問修飾符即可。 ...
  • 一、.NET MVC 學習筆記(一)——新建MVC工程 接觸MVC有段時間了,一直想找機會整理一下,可是限於文筆太差,所以一直遲遲羞於下手,想到最近做過的MVC項目也有一些了,花點時間整理一下方便以後工作。 開發環境: VS2015 1. 打開VS2015 2. 點擊【新建項目...】,選擇【ASP ...
  • 今天我來學習泛型,泛型是編程入門學習的基礎類型,從.net誕生2.0開始就出現了泛型,今天我們開始學習泛型的語法和使用。 什麼是泛型? 泛型(generic)是C#語言2.0和通用語言運行時(CLR)的一個新特性。泛型為.NET框架引入了類型參數(type parameters)的概念。類型參數使得 ...
  • var retryTimes = 5; //重試次數 int times = 0; skip: //代碼段開始 //處理邏輯 var result=false ; //處理結果 //..... //處理邏輯 //判斷 處理結果是否成功, 並且 重試次數是否達到上限 (處理成功,不需要重試,或達到上限 ...
  • 上篇我們說到了基於EFCore的基礎擴展,這篇我們講解下基於實體結合拉姆達表達式的自定義更新以及刪除數據. 先說下原理:其實通過實體以及拉姆達表達式生成SQL語句去執行 第一種更新擴展: 自定義更新欄位以及自定義擴展條件,請看下麵的代碼 從上面的方法中我們看到幾個參數,第一個參數不必說,擴展方法第一 ...
  • 先從下圖看整體項目結構: Mango.Manager: 為後臺管理項目 Mango.Web: 為前臺項目 Mango.Framework.Core: 為常用的基礎操作類項目 Mango.Framework.EFCore: 為基於EFCore封裝以及相關擴展類庫項目 Mango.Framework.S ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...