EntityFrameworkCore 模型自動更新(上)

【導讀】嗯,距離上一次寫博文已經過去近整整十個月,還是有一些思考,但還是變得懶惰了,心思也不再那么專注,有點耗費時間,學習也有點停滯不前,那就順其自然,隨心所欲吧,等哪天心血來潮,想寫了就寫寫。

模型自動更新(上)

一般團隊人數很少時,使用EF Core內置遷移基本已滿足,滿足的基本前提首先要生成遷移文件,然后和數據庫進行對比,但團隊人數一多,遷移文件等等涉及提交沖突等等,所以大部分情況下,我個人認為EF Core遷移基本沒啥用,這玩意用不起來

尤其涉及到版本分支很多情況下,切換不同分支所使用的數據可能也會不同,我們常用MySql數據庫,同時適配了人大金倉數據庫、高斯數據庫(GaussDb for opengauss),其對應的表結構有一些差異性,列類型也會有很大差異性,這對開發人員和測試人員來講就是深深的折磨和痛苦,大部分時間會花在保持數據庫表結構和模型一致,否則要么運行不起來,要么測試功能各種有問題,所以想想通過自動化方式來解決這個問題,本文還是分上下兩篇寫好了。

那么解決此問題的思路是怎樣的呢?同時適配多套數據庫,重寫一套?

那是不闊能的,既然我們可以通過dotnet ef命令來進行遷移,通過和數據庫表結構進行對比,從而生成遷移文件,遷移文件包含即將要執行的差異性腳本,從這個角度來看的話,我們從遷移類反堆即可得到生成的腳本以及和數據庫進行對比操作方法

初步設想理論上應該行得通,只需花時間了解下源碼就好,通過前期兩天的啃源碼,最終啃出百把行代碼即可自動更新模型到數據庫,當然這個過程中還涉及一些要考慮的細節,我們一一再敘。接下來我們以MySql為例講講整個過程,其他數據庫依葫蘆畫瓢就好,首先甩出如下代碼:

var?services?=?new?ServiceCollection();services.AddEntityFrameworkMySql();services.AddEntityFrameworkDesignTimeServices();services.AddDbContext<EfCoreDbContext>((serviceProvider,?options)?=>
{options.UseInternalServiceProvider(serviceProvider);options.UseMySql("server=localhost;Port=3306;Database=test;Username=root;Password=root;",ServerVersion.AutoDetect("server=localhost;Port=3306;Database=test;Username=root;Password=root;"));
});services.AddScoped<IDatabaseModelFactory,?MySqlDatabaseModelFactory>();var?serviceProvider?=?services.BuildServiceProvider();

EF Core有屬于它自己的容器,所以我們將全局容器和上下文所屬容器做了區分,同時呢,我們將遷移中要用到的操作依賴也手動添加,比如上面的設計服務,存在于 Microsoft.EntityFrameworkCore.Design 包內,最后將獲取數據庫表結構模型工廠手動注入即MySqlDatabaseModelFactory。接下來我們要獲取模型定義以及屬性一些定義等等,也就是我們最終要生成的目標模型結構

using?var?scope?=?_serviceProvider.CreateScope();var?currentServiceProvider?=?scope.ServiceProvider;var?context?=?(DbContext)currentServiceProvider.GetRequiredService<T>();var?connectionString?=?context.Database.GetDbConnection().ConnectionString;var?targetModel?=?context.GetService<IDesignTimeModel>().Model.GetRelationalModel();if?(targetModel?==?null)
{return?Enumerable.Empty<MigrationOperation>().ToList();
}

接下來則是獲取數據庫表結構也就是數據庫模型

var?databaseFactory?=?currentServiceProvider.GetService<IDatabaseModelFactory>();var?factory?=?currentServiceProvider.GetService<IScaffoldingModelFactory>();var?tables?=?context.Model.GetEntityTypes().Select(e?=>?e.GetTableName()).ToList();if?(!tables.Any())
{return?Enumerable.Empty<MigrationOperation>().ToList();
}//?僅查詢當前上下文模型所映射表,否則比對數據庫表差異時,將會刪除非當前上下文所有表
var?databaseModel?=?databaseFactory.Create(connectionString,?new?DatabaseModelFactoryOptions(tables:?tables));if?(databaseModel?==?null)
{return?Enumerable.Empty<MigrationOperation>().ToList();
}

這里稍微需要注意的是,若是有多個不同上下文,肯定只查詢當前上下文所對應的模型結構,不然最后生成的腳本會將其他上下文對應的表結構給刪除。緊接著,我們需要將數據庫模型轉換為上下文中的模型,即類型一致轉換,這就演變成了我們的源模型

var?model?=?factory.Create(databaseModel,?new?ModelReverseEngineerOptions());if?(model?==?null)
{return?Enumerable.Empty<MigrationOperation>().ToList();
}var?soureModel?=?model.GetRelationalModel();

接下來自熱而然就進行源模型和目標模型差異性比對,得到實際要進行的遷移操作

var?soureModel?=?model.GetRelationalModel();//TODO?Compare?sourceModel?vs?targetModelvar?modelDiffer?=?context.GetService<IMigrationsModelDiffer>();var?migrationOperations?=?modelDiffer.GetDifferences(soureModel,?targetModel);

那接下來問題來了,拿到差異性遷移操作后,我們應該怎么處理呢?留著各位思考下

本文給出了自動更新模型思路以及整個完整實現邏輯,剩余內容我們下篇再敘,主要是沒心情寫,寫不下去了,今天我們就到此為止~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282937.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282937.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282937.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IDEA 快捷注釋

1. 新建類的注釋模板 1) File->settings->Editor->Live Templates 2) 點擊綠色號&#xff0c;選擇template group &#xff0c;輸入group的name&#xff0c;然后點ok 3) 選中剛才添加的group,點擊號,選擇live Template 4) 代碼模板位置,個人用的代碼: 1 /** 2 * &…

matlab 如何hidden,Matlab基本函數-hidden函數

1、hidden函數&#xff1a;設置或取消隱藏線模式2、用法說明(1)hidden on 函數對當前圖形打開隱藏線條刪除&#xff0c;使網格圖后面的線條被前面的線條遮住。設置曲面圖形對象的屬性FaceColor為坐標軸背景顏色&#xff1b;(2)hidden off 函數對當前圖形關閉隱藏線條刪除&#…

java高級----Thread之CyclicBarrier的使用

CyclicBarrier是一個同步輔助類&#xff0c;它允許一組線程互相等待&#xff0c;直到到達某個公共屏障點 (common barrier point)。今天我們就學習一下CyclicBarrier的用法。 CyclicBarrier的簡單使用 類CyclicBarrier不僅有CountDownLatch所具有的功能&#xff0c;還可以實現屏…

異常處理,究竟是處理什么

“系統中每行代碼&#xff0c;都應該是有意義的&#xff0c;如果一段代碼可有可無&#xff0c;那它就不應該存在。”01—內容簡述異常處理是軟件開發的必備技能&#xff0c;但“異常處理&#xff0c;究竟是處理什么&#xff1f;”&#xff0c;很多小伙伴并沒有一個清晰的認識&a…

第十一篇:(順序)容器的好伴侶 --- 容器適配器

前言 vector容器的數據結構原型是順序表&#xff0c;它很好的實現了順序表的功能&#xff0c;大大方便了編程。好了&#xff0c;現在假設有天我又想用棧&#xff0c;那么有沒有棧對應的容器呢&#xff1f;很遺憾&#xff0c;木有。但基于“棧”可以由順序表或者鏈表實現這一特性…

第一季度ADC市場份額揭榜 A10 Networks再獲用戶青睞

近日&#xff0c;根據全球知名咨詢公司IDC 發布的2018年第一季度中國ADC市場分析報告顯示&#xff0c;A10 Networks 穩占中國ADC市場份額第二名。數據來源&#xff1a;IDC 2018年Q1 ADC市場報告 從廠商排名來看依次為 F5 30%, A10Networks 12%, DPtech 12% ,Sangfor 9% &#…

zblog php 標題優化,Zblog分類頁標題重復的優化 - 張力博客

今天瘋子無聊上自己博客看看&#xff0c;點了幾個頁面就發現一個問題。我博客分類頁的標題怎么第一頁和后面的頁數都是一樣的&#xff0c;這一點相信大家都知道對于SEO優化是很不好的一點。我也看了同樣的一些個人zblog博客也存在這樣的問題。于是我在網上就找了關于修改zblog分…

利用linux shell自己主動頂貼

在論壇上面發帖問個什么東西的話&#xff0c;一旦不頂。帖子就秒沉了&#xff0c;可是又實在不想每時每刻都去頂&#xff0c;怎么辦&#xff1f;以下展示了怎樣利用shell 的crontab實現自己主動頂貼。 閑話不多說了&#xff0c;以豆瓣為例—– 1&#xff1a; 用chrome打開豆瓣…

Linux命令之telnet 命令

介紹 Telnet是常用的遠程控制Web服務器的方法 Telnet協議是TCP/IP協議族中的一員&#xff0c;是Internet遠程登陸服務的標準協議和主要方式。它為用戶提供了在本地計算機上完成遠程主機工作的能力。在終端使用者的電腦上使用telnet程序&#xff0c;用它連接到服務器。終端使用者…

深度學習庫 SynapseML for .NET 發布0.1 版本

2021年11月 微軟開源一款簡單的、多語言的、大規模并行的機器學習庫 SynapseML&#xff08;以前稱為 MMLSpark&#xff09;&#xff0c;以幫助開發人員簡化機器學習管道的創建。具體參見[1]微軟深度學習庫 SynapseML&#xff1a;可直接在系統中嵌入 45 種不同機器學習服務、支持…

Buildroot stress-ng Linux系統壓力測試

/*********************************************************************** Buildroot stress-ng Linux系統壓力測試* 說明&#xff1a;* 之前有使用lmbench對整板進行一些測試&#xff0c;如果相對某一部分專門進行測試&#xff0c;* 就可以參考使用stree-ng…

支持回調處理 php函數,PHP支持回調的函數有哪些?

PHP支持回調的函數有&#xff1a;1、匿名函數&#xff0c;代碼為【$server->on Request】&#xff1b;2、類靜態方法&#xff0c;代碼為【static function test $req】&#xff1b;3、函數&#xff0c;代碼為【my_onRequest $req】。PHP支持回調的函數有&#xff1a;1、匿名…

病毒木馬查殺實戰第019篇:病毒特征碼查殺之編程實現

前言上次我們已經簡介過了病毒特征碼提取的基本方法&#xff0c;那么這次我們就通過編程來實現對于病毒的特征碼查殺。定義特征碼存儲結構為了簡單起見。這次我們使用的是setup.exe以及unpacked.exe這兩個病毒樣本。經過上次的分析&#xff0c;我們對setup.exe樣本的特征碼提取…

《ASP.NET Core 6框架揭秘》實例演示[22]:如何承載你的后臺服務[補充]

借助 .NET提供的服務承載&#xff08;Hosting&#xff09;系統&#xff0c;我們可以將一個或者多個長時間運行的后臺服務寄宿或者承載我們創建的應用中。任何需要在后臺長時間運行的操作都可以定義成標準化的服務并利用該系統來承載&#xff0c;ASP.NET Core應用最終也體現為這…

命令行打印文件樹列表: tree

Linux & Mac 1.下載tree lib //mac brew install tree //centos yum install tree //ubuntu apt-get install tree 用法 //顯示所有文件 tree //顯示深度2層 tree -L 2 2. 命令find組合 find . -print | sed -e s;[^/]*/;|____;g;s;____|; |;g > structure.txt 移除node…

java 二分法查找數組,Java二分法查找數組元素下標

package pers.ly.javase.algorithm;import java.util.Arrays;/*** 二分法查找* author: Lu Yang* date: 2019-01-23 10:50:37**/public class BinarySearch {public static void main(String[] args) {Integer[] arr {10,50,30,40,10,80,90,70,60,40,100,10};// 數組排序 ->…

ASP.NET Core MVC壓縮樣式、腳本及總是復制文件到輸出目錄

前言 在.NET Core之前對于壓縮樣式文件和腳本我們可能需要借助第三方工具來進行壓縮&#xff0c;但在ASP.NET MVC Core中則無需借助第三方工具來完成&#xff0c;本節我們來看看ASP.NET Core MVC為我們提供了哪些方便。 自動壓縮樣式和腳本 當我們在測試環境中肯定不需要壓縮腳…

京東訂單自動評價方法

剛剛完成的一個京東自動訂單腳本, 以后還要加入其它京東自動的腳本項目地址: https://github.com/mm333444/aox_jd_auto_script 京東自動完成腳本 目前只完成京東訂單自動評價, 評價時會自動上傳商品圖片 一、安裝 1. 程序依賴 python3.52. 安裝配置 安裝pipenv安裝模塊 pipenv…

matlab空間散點擬合曲線,matlab離散點擬合曲線

matlab曲線擬合與數值點標注實例_工程科技_專業資料。實例 1: 現已知兩組...Matlab教程 曲線擬合工具箱 數學科學與技術學院 胡金燕 lionfr 曲線擬合定義 在實際工程應用和科學實踐中,經常需要尋求 兩個(或多個)變量間的關系,而......(p,x); %獲得x點處對相應的y值 plot(x,y,r*…

redis下并發問題解決方案

http://effective.blog.51cto.com/8296150/1671743 現在的計算機大都是多核的cpu,意味著可以并行執行多個進程.如果這多個運行的進程對同一份數據進行讀寫操作,那么就有可能出現兩個或者多個進程讀到的都是老的數據,這種情況下,再進行寫入操作之后就會有一些進程寫入的數據被覆…