基於abp框架的數據庫種子數據初始化

[toc]html

#Abp系列 #一.abp框架運行——先後端分離(基於VUE) #二.基於abp框架的數據庫種子數據初始化sql

#基於abp框架的數據庫種子數據初始化數據庫

#1.背景 最近在用abp開發項目,須要將以下區域數據經過程序的初次運行種入數據庫。後端

不知道你們是怎麼去管理數據庫跟後臺程序的同步的,基於Git的數據庫sql文件的管理——完美解決團隊sql操做協同問題,此文是我之前的一個思考。 可是有三個缺點:app

  1. 運維總會忘記去更新數據庫,致使異常;
  2. 不一樣的後端有時候也難以同步;
  3. 管理sql自己要耗費必定的經歷。 綜上,這次開發決定數據庫的初始化數據寫在程序中,與程序一同管理。解決了上述三個問題。

備註本文用的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; }

    }
  • Entity<long> 是Abp.Domain.Entities命名空間中的一個基類,能夠指定Id的類型。
  • 須要以下構造函數爲了方便初始化數據調用
public Area(int id, string areaName, int parentID, int level)
        {
            this.Id = id;
            this.AreaName = areaName;
            this.ParentID = parentID;
            this.level = level;
        }
  • 另外還須要個空構造函數,爲了EFCore可以正常使用。
public Area()
        {
        }

#6.小結

  • 本文提供了一種管理後臺程序和數據庫表結構和初始化數據的一種方案(基於EFCore)。不適合Dapper等半自動沒法CodeFirst的ORM。
  • ABP框架的種子數據種入數據庫,會獲取到數據庫上下文,掃描出表中缺失的數據,補錄丟失的某條或者某幾條記錄。
相關文章
相關標籤/搜索