最近在用abp开发项目,须要将以下区域数据经过程序的初次运行种入数据库。html
不知道你们是怎么去管理数据库跟后台程序的同步的,基于Git的数据库sql文件的管理——完美解决团队sql操做协同问题,此文是我之前的一个思考。
可是有三个缺点:vue
备注本文用的abp框架为第一代,官网:https://aspnetboilerplate.com/。 模板下载运行方法(先后端分离)能够参照此文abp框架运行——先后端分离(基于VUE)。sql
本文执行方法参照的是abp框架的默认语言种子数据种入。数据库
//初始化区域数据的引用 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) }; }
构造函数,经过依赖注入容器拿到数据库上下文。后端
//PEMS系统数据库上下文 private readonly PEMSDbContext _context; /// <summary> /// 构造函数,经过依赖注入容器拿到数据库上下文 /// </summary> /// <param name="context"></param> public DefaultAreaCreator(PEMSDbContext context) { _context = context; }
对依赖注入不明白的道友,能够参照此文 在net Core3.1上基于winform实现依赖注入实例app
/// <summary> /// 封装调用 建立初始化数据列表方法,这样上层调用看上去格式一致 /// </summary> public void Create() { CreateArea(); } /// <summary> /// 建立初始化数据列表方法 /// </summary> private void CreateArea() { foreach (var area in InitialArea) { AddAreaIfNotExists(area); } }
遍历初始区域表,将数据加入到数据库中去。框架
经过数据库上下文,获取数据库中的区域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(); }
数据库中没有数据或者缺失某条或者某几条记录。结果都是以下初始数据。运维
位于项目的领域层。
函数
/// <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() { }