1. 程式人生 > >使用 Entity Framework Core 時,通過程式碼自動 Migration

使用 Entity Framework Core 時,通過程式碼自動 Migration

一 介紹

  在使用 Entity Framework Core (下面就叫 EF Core 吧)進行開發時,如果模型有變動,我們要在用 EF Core 提供的命令列工具進行手工遷移,然後再執行程式。但是為了效率,我想能不能在程式的入口處進行 Migration 呢?從個人經驗來說應該是可以,因為 EF Tool 雖然提供了 CLI 但是它最終也是被程式解析這些命令。下面就開始分析,如何通過程式碼進行 Migration 。

二 分析

  首先我們要先了解,在使用 EF Core 的 CLI 時,要執行兩個步驟:

    第一步:生成 Migration 檔案;

    第二步:更新變更項到資料庫;

  既然是先生成 Migration 檔案再更新,那麼在 EF Core 裡面一定有對應的模組做這件事情。下面我們看一下 EF Core 專案的結構。從中我們確實找到關於 Migration 的模組。在 Migrations/Design 目錄的類名稱上我們可以看出來,它就是生成 Migration 檔案的。這裡先到這兒。

  

  找到了生成 Migration 檔案的入口,我們再來找一下如何通過程式碼將這些變更更新到資料庫中。

  在使用 EF Core 的時候,我們都要通過繼承 DbContext 來編寫自己的 DbContext 子類。在 DbContext 類中我們找到了一個 Database

屬性。如下圖所示:

  

  然後查看了 DatabaseFacde 這個類,並沒有發現執行遷移相關的函式。通過程式碼搜尋,我在 RelationalDatabaseFacadeExtensions 這個類中有一個 Migration() 擴充套件方法。通過註釋的解析,我也確定了它就是執行 Migration 檔案,並將變更更新到資料庫。

  這兩個步驟對應的程式碼我們都找到了,下面我們就編寫一段兒程式碼,完成自動將模型變更更新到資料庫的功能。

 1 public class AutoMigration
 2 {
 3     private readonly IServiceProvider _serviceProvider;
4 private InformationDbContext _context; 5 6 public AutoMigration(IServiceProvider serviceProvider) 7 { 8 _serviceProvider = serviceProvider; 9 _context = serviceProvider.GetService<InformationDbContext>(); 10 } 11 12 public void Migrator() 13 { 14 var path = Path.Combine(AppContext.BaseDirectory, "..\\..\\..\\Migrations\\"); 15 if (!Directory.Exists(path)) 16 { 17 Directory.CreateDirectory(path); 18 } 19 else 20 { 21 Directory.GetFiles(path).ToList().ForEach(File.Delete); 22 } 23 24 using (_context) 25 { 26 var services = ((IInfrastructure<IServiceProvider>) _context).Instance; 27 var codeHelper = new CSharpHelper(); 28 var scaffolder = ActivatorUtilities.CreateInstance<MigrationsScaffolder>(services, 29 new CSharpMigrationsGenerator(codeHelper, new CSharpMigrationOperationGenerator(codeHelper), 30 new CSharpSnapshotGenerator(codeHelper))); 31 32 var projectDir = Path.Combine(path, "..\\"); 33 var migrationAssembly = new MigrationsAssembly(new CurrentDbContext(_context), _context.Options, new MigrationsIdGenerator()); 34 scaffolder.GetType().GetField("_migrationsAssembly", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(scaffolder, migrationAssembly); 35 36 var readonlyDic = new ReadOnlyDictionary<string,TypeInfo>(new Dictionary<string, TypeInfo>()); 37 migrationAssembly.GetType().GetField("_migrations", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(migrationAssembly, new LazyRef<IReadOnlyDictionary<string, TypeInfo>>(readonlyDic)); 38 var migration = scaffolder.ScaffoldMigration("Information.Migrations", "Information"); 39 40 scaffolder.Save(projectDir, migration, path); 41 42 //另外一種儲存方式 43 //File.WriteAllText($"Migrations\\{migration.MigrationId}{migration.FileExtension}", migration.MigrationCode); 44 //File.WriteAllText("Migrations\\" + 45 // migration.MigrationId + ".Designer" + migration.FileExtension, 46 // migration.MetadataCode); 47 //File.WriteAllText("Migrations\\" + migration.SnapshotName + migration.FileExtension, 48 // migration.SnapshotCode); 49 } 50 51 using(_context = (InformationDbContext)_serviceProvider.GetService<IDbContext>()) 52 { 53 _context.Database.Migrate(); 54 } 55 } 56 }

  另外一個注意點:我們需要指定一下遷移檔案所在專案。

1 services.AddDbContext<InformationDbContext>(opt =>
2 {
3     var connectionString = configuration["ConnectionStrings:DefaultConnection"];
4     opt.UseSqlServer(connectionString, optionBuilder =>
5     {
6         optionBuilder.MigrationsAssembly("Information");
7     });
8 });

三 總結

  通過上面的分析可以知道,其實我們就是把 CLI 的兩個命令通過程式碼實現了一下。在 Startup 檔案中進行呼叫即可。為什麼想這麼幹?因為在實際開發的時候,來回切換視窗心裡覺得不爽了唄。:)

相關推薦

使用 Entity Framework Core 通過程式碼自動 Migration

一 介紹   在使用 Entity Framework Core (下面就叫 EF Core 吧)進行開發時,如果模型有變動,我們要在用 EF Core 提供的命令列工具進行手工遷移,然後再執行程式。但是為了效率,我想能不能在程式的入口處進行 Migration 呢?從個人經驗來說應該是可以,因為 EF T

Entity Framework Core 2.0 使用程式碼進行自動遷移

一.前言 我們在使用EF進行開發的時候,肯定會遇到將遷移更新到生產資料庫這個問題,前面寫了一篇文章介紹了Entity Framework Core 2.0的入門使用,這裡面介紹了使用命令生成遷移所需的SQL,然後更新到生產資料庫的方法。這裡還有另一種方法,就是利用EF Co

ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基礎教程 - 簡單教程簡單編程

先來 server tps 設計 cos ble ESS thead 安裝失敗 原文:ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基礎教程 - 簡單教程,簡單編程 ASP.NET Core 配置 E

Entity Framework Core 2.1新增種子資料

EFCore 2.1出來有一段時間了,裡面的新功能還沒怎麼用,今天研究下如何使用EF Core 2.1新增種子資料。 我們在開發時總是需要新增一些種子資料的,所以這個功能還是比較有用的。 準備工作 我建立了一個ASP.NET Core專案,裡面有幾個Model,其中一個是省份Province,另

通過滾動條向下滾動DIV廣告自動跟著向下滾動並且點選置頂

<html> <head>     <title></title>     <script src="../Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>  

VS中使用Entity Framework連線Mysql新增Entity Data Model嚮導閃退解決方案

之前因為覺得MS SQL太龐大,而且安裝緩慢,就改用Mysql了。 在使用嚮導從Mysql資料庫中生成Entity Data Model時,在嚮導的以下介面點選“下一步”,後面的介面閃退。 也就是以下介面: 解決方案如下: 在VS的Server Explorer中刪除

Entity Framework Core 中使用多個DBContext要注意

使用多個DBContext如果有主鍵和外來鍵之間的連線,如果每個DBContext分別生成遷移配置檔案,再啟動程式,會造成未知異常。 因為2個表如果有主鍵和外來鍵的連線,但是2個表分別在2個DBContext中,那麼EF core會難以進行資料連線之間的判斷,可能會因為找不

Entity Framework Core Relationship的學習筆記

header list over 文獻 otn nds creating mssql sof 說明 此例篩選了感興趣及常用部分 參考文獻 https://docs.microsoft.com/en-us/ef/core/modeling/relationships One

Entity Framework Core 2.0 新特性

order 3.4 高速緩存 字符串插值 常見 repr asp 而不是 spa 前言 Entity Framework Core 2.0更新也已經有一段時間了,園子裏也有不少的文章.. 看了下2.0的新特性基本算是完成了我之前發布的路線圖的內容 很不錯 下面就介紹一下新特

NET Core & Entity Framework Core

uget docs f11 自動生成 腳本 字符 obj 數據庫操作 eba 本文是ABP官方文檔翻譯版,翻譯基於 3.2.5 版本 官方文檔分四部分 一、 教程文檔 二、ABP 框架 三、zero 模塊 四、其他(中文翻譯資源) 本篇是第一部分的第一篇。 第一部分分

初試 Entity Framework Core 的多對多映射

include pan top output args first with spa 提問 今天在博問中看到一個關於 EF Core 的提問 ef core 2.0 多對多查詢的問題,由於還沒使用過 EF Core 的多對多映射,於是參考 EF Core 幫助文檔快速寫了個

.Net Entity Framework Core 用 HasColumnType 配置浮點數精度

work lB amount override 發現 metadata 資料 前言 prot 一、前言 前段時間用.Net Entity Framework core搭建框架,需要配置浮點數的精度,發現.Net Entity Framework core 並沒有HasPre

ASP.Net Core項目在Mac上使用Entity Framework Core 2.0進行遷移可能會遇到的一個問題.

連接字符串 ron dex cal orm 並且 fig pre RM 在ASP.Net Core 2.0的項目裏, 我使用Entity Framework Core 2.0 作為ORM. 有人習慣把數據庫的連接字符串寫在appSettings.json裏面, 有的習慣寫

3ds Max在啟動語言出現“MAXScript 自動加載腳本錯誤”

MAXScript自動加載腳本錯誤 3ds Max安裝錯誤 MAXScript 問題: 在安裝 NVIDIA 的 Mental Ray 並啟動法語、德語、巴西葡萄牙語、中文或日語的 3ds Max 2018 後,出現與 VFB_methods.ms 文件有關的“MAXScript

ASP.NET CORE系列【六】Entity Framework Core 之數據庫遷移

snapshot 文章 src AD data 上下 ont pre 發生 前言 最近打算用.NET Core寫一份簡單的後臺系統,來練練手 然後又用到了Entity Framework Core 發現園子裏有些文章講得不是那麽細節,對於新手小白來說,可能會有點懵。 特意

[Abp 源碼分析]七、倉儲與 Entity Framework Core

val imp logger arguments 方便 解析 depend 有一個 eof 0.簡介 Abp 框架在其內部實現了倉儲模式,並且支持 EF Core 與 Dapper 來進行數據庫連接與管理,你可以很方便地通過註入倉儲來操作你的數據。 例如: public c

【視頻】Entity Framework Core 2.* 入門教程

數據 mode .com video work 查詢 刪除 page player 視頻專輯在B站上:https://www.bilibili.com/video/av34462368/ 內容暫時如下,還在更新中: 1. 簡介 & 創建Model,生成數據

jenkins 部署 並執行npm run dev 專案execute shell自動結束程序問題

使用 jenkins 部署 vue (npm run dev)專案時,部署狀態是顯示部署成功,但是服務沒有成功啟動,在做程序服務監控的時候發現,jenkins部署時候服務也啟動成功了,但是jenkins部署成功後 自動kill殺死或結束該程序和該程序的衍生的程序,那麼就讓jenkins不

Entity Framework Core介紹(1)

介紹 Entity Framework (EF) Core 是輕量化、可擴充套件和跨平臺版的常用 Entity Framework 資料訪問技術。 EF Core 可用作物件關係對映程式 (O/RM),以便於 .NET 開發人員能夠使用 .NET 物件來處理資料庫,這樣就不必經常編寫大部分資料訪問程式碼了

Entity Framework Core 入門(2)

安裝 EF Core 將 EF Core 新增到不同平臺和常用 IDE 中的應用程式的所需步驟彙總。 分步入門教程 無需具備 Entity Framework Core 或任何特定 IDE 的原有知識,即可學習這些入門教程。 這些教程將逐步介紹如何建立用於查詢和儲存資料庫中資料的簡單應用程式。