第九節:EF Core各種遷移指令(CodeFirst和DBFirst)


一. CodeFirst模式指令

1.前提:

  必須的程序集: Microsoft.EntityFrameworkCore.Tools

          Microsoft.EntityFrameworkCore.Design

  EF自身的程序集:Microsoft.EntityFrameworkCore

           Microsoft.EntityFrameworkCore.SqlServer

2. 常見指令

(1).創建遷移:Add-Migration xxxx

說明:生成遷移文件,有三個,分別是:

  a: 20191025092317_initCreate1:主遷移文件。 包含應用遷移所需的操作 Up() 和 還原遷移所需的操作 Down()

  b: 20191025092317_initCreate1.Designer.cs:遷移元數據文件。 包含 EF 所用的信息,如給實體類型構建屬性、主鍵、外鍵、索引、映射到數據表,主體和依賴關系等等。

  c: YpfDbContextModelSnapshot:當前模型的快照。用於確定添加下一次遷移時更改的內容(用於遞增更新)。

(2).更新(創建)數據庫:Update-Database xxxx

說明:根據遷移 創建/更新 數據庫

(3).刪除遷移:Remove-Migration

       Update-Database -Migration:0 (代表:刪除數據庫中所有表,僅僅剩了一個遷移表了)

(4).生成SQL腳本:Script-Migration -Output D:\InitialCreate.sql

          Script-Migration -From 0 -To InitialCreate -Output D:\InitialCreate.sql

(5).刪除數據庫:Drop-Database

 會產生指令:[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暫停(S) [?] 幫助(默認為“Y”):,輸入Y,即可以刪除。

 

3.代碼配置

(1).運行時遷移:dbContext.Database.Migrate();

        dbContext.GetService<IMigrator>();

PS:找最新的遷移文件,更新或創建數據庫,等效於上面的 Update-Database xxxx

(2).刪除數據庫:dbContext.Database.EnsureDeleted();

(3).創建數據庫:dbContext.Database.EnsureCreated();

(4).生成創建數據庫的語句:var sql = dbContext.Database.GenerateCreateScript();

4. 案例說明

 (1). 新建兩張表 UserInfor,RoleInfor,上下文YpfDbContext,並做好相應的依賴注入配置,數據庫鏈接如下:

Server=localhost;Database=dbCore1;User ID=sa;Password=123456;

輸入指令:【Add-Migration initCreate1】,會生成遷移文件。

輸入指定:【Update-Database initCreate1】,將遷移文件映射生成對應的數據庫。

 (2). 后續無論是增加還是減少、修改相關操作,都是先生成遷移文件,然后映射到數據庫。

比如:RoleInfor表中增加一個字段addTime,則

先輸入指令:【Add-Migration initCreate2】,會生成遷移文件。

先輸入指定:【Update-Database initCreate2】,將遷移文件映射生成對應的數據庫。

 

 如果這個時候再執行一下【Update-Database initCreate1】,數據庫就會回到initCreate1的遷移,會發現數據庫RoleInfor表中的addTime字段已經不見了,但是代碼中RoleInfor類中addTime字段還存在。

 

二. DBFirst模式指令

1. 前提

  必須的程序集:Microsoft.EntityFrameworkCore.Tools

2.常見指令

(1).數據庫連接字符串

  "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;"

(2).基礎命令

 【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer】

解釋:

  全部生成在根目錄;上下文默認名稱為:數據庫名+Context;類名中'_'省略了;映射生成類的屬性:首字母大寫;默認采用FluentApi的方式配置; 默認映射生成所有的表。

(3).指定上下文 和 實體的目錄

 【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models】

解釋:

①. -ContextDir MyDbContext : 代表EF上下文類放在MyDbContex文件夾的目錄下

②. -OutputDir Models:代表所有的實體類放在Models文件夾的目錄下

(4).指定表

 【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir MyDbContext -OutputDir Models -Tables T_UserInfor,T_RoleInfor】

解釋:

①:-Tables T_UserInfor,T_RoleInfor:僅映射生成 T_UserInfor,T_RoleInfor

(5).指定EF上下文名稱

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir MyDbContext -OutputDir Models -Tables T_UserInfor,T_RoleInfor -Context ypfContext 】

 解釋:

①:-Context ypfContext:代表指定EF上下文的名稱為“ypfContext”,默認的生成規則是: 數據庫名+Context

(6).保留數據庫和表的名稱

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir MyDbContext -OutputDir Models -Tables T_UserInfor,T_RoleInfor -Context ypfContext -UseDatabaseNames 】

解釋:

①:-UseDatabaseNames:代表完全按照數據庫中表名或字段來映射生成相應的實體

(7).指定FluentApi 或 數據注解

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir MyDbContext -OutputDir Models -Tables T_UserInfor,T_RoleInfor -Context ypfContext -UseDatabaseNames -DataAnnotations】

解釋:

①. -DataAnnotations: 代表用數據注解的形式配置實體類屬性,默認用的是FluentApi的形式進行配置。

(8).覆蓋指令(全表的)

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir MyDbContext -OutputDir Models -Context ypfContext -UseDatabaseNames -DataAnnotations -Force】

解釋:

①. 如果數據變動很小,那么我們完全可以手動的去改一下代碼的配置即可。

②. 如果數據庫修改內容多,手動修改代碼配置會很麻煩,這個時候我們使用指令 【-Force】再次映射,即覆蓋了原先的代碼配置映射

特別注意:

-Force指令:可以同步數據庫表的增加,字段增加修改刪除,但是如果數據庫中刪除了一張表,該指令只能同步EF上下文中的配置,刪除不了對應的類,需要手動到代碼中刪除對應的映射類

 ContextDir后面的輸出目錄不要寫DbContext,與EF上下文命名空間重復,導致引用混亂。

最終指令總結:

(1).全表的首次映射:

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir MyDbContext -OutputDir Models -Context ypfContext -UseDatabaseNames -DataAnnotations】

(2).全表的后續修改:

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir MyDbContext -OutputDir Models -Context ypfContext -UseDatabaseNames -DataAnnotations -Force】

 

3. 配置用戶私密

(1).先右鍵選中項目,點擊“管理用戶機密”,會彈出一個secret.json的空文件,保存一下。這個時候右鍵點擊“編輯xxx.csproj”,會發現多了一個:

  <UserSecretsId>a030bf23-9ce4-4051-9d99-0d2f91b636d6</UserSecretsId>

  這個就代表可以用來映射機密文件的ID。

 

(2).進入到項目的根目錄,Shift右鍵管理員運行,運行下面指令,則將配置文件存入到了加密區。

【dotnet user-secrets set myDBStr "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" 】

 

 

(3).運行指令進行映射

【Scaffold-DbContext Name=myDBStr Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -Context ypfContext -UseDatabaseNames -DataAnnotations】

注:生成的EF上下文中的OnConfiguring方法中,連接字符串也使用了機密文件,如下:

optionsBuilder.UseSqlServer("Name=myDBStr");  但是這種模式不支持這么連接,必須改成依賴注入的方式才可以使用機密文件,如下:

services.AddDbContext<ypfContext>(option => option.UseSqlServer("Name=myDBStr"));

 

 

 

!

  • 作       者 : Yaopengfei(姚鵬飛)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 聲     明1 : 本人才疏學淺,用郭德綱的話說“我是一個小學生”,如有錯誤,歡迎討論,請勿謾罵^_^。
  • 聲     明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM