[toc]html
#Abp系列 #一.abp框架運行——先後端分離(基於VUE) #二.基於abp框架的數據庫種子數據初始化sql
#基於abp框架的數據庫種子數據初始化數據庫
#1.背景 最近在用abp開發項目,須要將以下區域數據經過程序的初次運行種入數據庫。後端
不知道你們是怎麼去管理數據庫跟後臺程序的同步的,基於Git的數據庫sql文件的管理——完美解決團隊sql操做協同問題,此文是我之前的一個思考。 可是有三個缺點:app
備註本文用的abp框架爲第一代,官網:https://aspnetboilerplate.com/。 模板下載運行方法(先後端分離)能夠參照此文abp框架運行——先後端分離(基於VUE)。框架
#2.參照 本文執行方法參照的是abp框架的默認語言種子數據種入。前後端分離
#3.解決方案運維
##3.1 初始化數據函數
//初始化區域數據的引用 public List<Area> InitialArea => GetInitialArea(); /// <summary> /// 初始化數據 /// </summary> /// <returns></returns> private List<Area> GetInitialArea() { return new List<Area> { new Area(110000,"北京市", 0, 1), new Area(110101,"東城區", 110100, 3), new Area(110102,"西城區", 110100, 3) }; }
##3.2 依賴注入方法容器裏獲取數據庫上下文 構造函數,經過依賴注入容器拿到數據庫上下文。this
//PEMS系統數據庫上下文 private readonly PEMSDbContext _context; /// <summary> /// 構造函數,經過依賴注入容器拿到數據庫上下文 /// </summary> /// <param name="context"></param> public DefaultAreaCreator(PEMSDbContext context) { _context = context; }
對依賴注入不明白的道友,能夠參照此文 在net Core3.1上基於winform實現依賴注入實例 ##3.3 封裝建立初始化數據列表方法
/// <summary> /// 封裝調用 建立初始化數據列表方法,這樣上層調用看上去格式一致 /// </summary> public void Create() { CreateArea(); } /// <summary> /// 建立初始化數據列表方法 /// </summary> private void CreateArea() { foreach (var area in InitialArea) { AddAreaIfNotExists(area); } }
遍歷初始區域表,將數據加入到數據庫中去。 ##3.4 數據庫中沒有的初始化數據,補充到數據庫中去 經過數據庫上下文,獲取數據庫中的區域id區域名稱。與初始化數據對比,丟失的數據,添加到數據庫裏去。
/// <summary> /// 某個區域記錄缺失時,將該記錄從新種入數據庫進行持久化 /// </summary> /// <param name="area"></param> private void AddAreaIfNotExists(Area area) { if (_context.Area.IgnoreQueryFilters().Any(a => a.Id== area.Id && a.AreaName == a.AreaName)) { return; } _context.Area.Add(area); _context.SaveChanges(); }
#4.效果 數據庫中沒有數據或者缺失某條或者某幾條記錄。結果都是以下初始數據。
#5. Area實體 位於項目的領域層。
/// <summary> /// Area實體類 /// </summary> public class Area : Entity<long> { public Area() { } public Area(int id, string areaName, int parentID, int level) { this.Id = id; this.AreaName = areaName; this.ParentID = parentID; this.level = level; } [StringLength(20)] public string AreaName { get; set; } public int ParentID { get; set; } public int level { get; set; } }
public Area(int id, string areaName, int parentID, int level) { this.Id = id; this.AreaName = areaName; this.ParentID = parentID; this.level = level; }
public Area() { }
#6.小結