基于abp框架的数据库种子数据初始化
Abp系列
一.abp框架运行——前后端分离(基于VUE)
二.基于abp框架的数据库种子数据初始化
基于abp框架的数据库种子数据初始化
1.背景
最近在用abp开发项目,需要将如下区域数据通过程序的初次运行种入数据库。
不知道大家是怎么去管理数据库跟后台程序的同步的,基于Git的数据库sql文件的管理——完美解决团队sql操作协同问题,此文是我以前的一个思考。
但是有三个缺点:
- 运维总会忘记去更新数据库,导致异常;
- 不同的后端有时候也难以同步;
- 管理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 依赖注入方法容器里获取数据库上下文
构造函数,通过依赖注入容器拿到数据库上下文。
//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
是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框架的种子数据种入数据库,会获取到数据库上下文,扫描出表中缺失的数据,补录丢失的某条或者某几条记录。
基于abp框架的数据库种子数据初始化的更多相关文章
- 利用代码生成工具生成基于ABP框架的代码
在前面随笔,我介绍了整个ABP优化过框架的分层模型,包括尽量简化整个ABP框架的各个层的关系,以及纳入一些基类的辅助处理,使得我们对应业务分层类或者接口尽可能减少代码,并具有生产环境所需要的基类接口, ...
- 使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面
世界上唯一不变的东西就是变化,我们通过总结变化的规律,以规律来应付变化,一切事情处理起来事半功倍.我们在开发后端服务代码,前端界面代码的时候,界面都是依照一定的规律进行变化的,我们通过抽取数据库信息, ...
- 在基于ABP框架的前端项目Vue&Element项目中采用电子签名的处理
在前面随笔介绍了<在基于ABP框架的前端项目Vue&Element项目中采用电子签章处理文件和打印处理>的处理,有的时候,我们在流程中或者一些文件签署的时候,需要签上自己的大名,一 ...
- 基于ABP框架的SignalR,使用Winform程序进行功能测试
在ABP框架里面,默认会带入SignalR消息处理技术,它同时也是ABP框架里面实时消息处理.事件/通知处理的一个实现方式,SignalR消息处理本身就是一个实时很好的处理方案,我在之前在我的Winf ...
- 在基于ABP框架的前端项目Vue&Element项目中采用日期格式处理,对比Moment.js和day.js的处理
Day.js 是一个轻量的处理时间和日期的 JavaScript 库,和 Moment.js 的 API 设计保持完全一样. 如果您曾经用过 Moment.js, 那么您已经知道如何使用 Day.js ...
- 记录从数据库把数据初始化mongodb缓存的一些坑
在项目启动时,需要做一些项目启动后的预操作,比如初始化数据进缓存等等. 这时就需要写listener,等监听.在项目启动时把数据缓存进mongodb. 但是这会有一个问题.项目一般都是把各种bean交 ...
- 基于ssh框架的highcharts前后台数据交互实例
Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ...
- 基于ABP框架的权限设置
需求:在界面展示中,"定向包管理","竞价管理","竞拍管理","发布定向资源","添加竞价资源", ...
- 在基于ABP框架的前端项目Vue&Element项目中采用电子签章处理文件和打印处理
在一些内部OA或者流转的文件,或者给一些客户的报价文件.合同,或者一些医院出示的给保险机构的病历资料等,有时候可能都希望快速的使用电子签章的处理方式来给文件盖上特定的印章,本篇随笔介绍基于Vue&am ...
随机推荐
- zabbix-agent服务无法启动
zabbix-agent服务无法启动解决方案1.先配置yum源2.卸载已经安装的zabbix-agent3.重新安装zabbix-agent4.配置zabbix-agent配置文件: Server=服 ...
- 论文翻译——Attention Is All You Need
Attention Is All You Need Abstract The dominant sequence transduction models are based on complex re ...
- MRP运算报错-清除预留
MRP运算报错-清除预留
- AdminSwagger2Configuration
package org.linlinjava.litemall.admin.config; import org.springframework.context.annotation.Bean; im ...
- rest framework-分页-长期维护
############### 分页组件 ############### # 分页组件 # # django也有分页,rest framework也有分页,但是没有页面这个概念了, # 这个分页 ...
- qsub|pasta|
cd /xxx/genome_stat/Annotation ln -s /xxx/02.annotation/gff_v2/*.homolog.v2.gff /xxx/genome_stat/Ann ...
- 康耐视软件VisionPro-max-u与VisionPro-plus-u的区别
康耐视软件VisionPro-max-u与VisionPro-plus-u的区别 1.VisionPro-plus-u为基础版可以直接运用该软件包的算法,拖拽式的窗口程序 2.VisionPro-ma ...
- 羽翼sqlmap视频笔记
access 注入 ./sqlmap.py -u "url" 注入判断./sqlmap.py -u "url" --tables 跑表./s ...
- Xpath 入门教程
准备xml 文档 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book ...
- MS12-020 3389蓝屏攻击
MS12-020 3389蓝屏攻击 search ms12_020 use exploit/dos/windows/rdp/ms12_020_maxchannelids set rhost 192.1 ...