一. 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 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。