Abp系列

一.abp框架运行——前后端分离(基于VUE)

二.基于abp框架的数据库种子数据初始化

基于abp框架的数据库种子数据初始化

1.背景

最近在用abp开发项目,需要将如下区域数据通过程序的初次运行种入数据库。

不知道大家是怎么去管理数据库跟后台程序的同步的,基于Git的数据库sql文件的管理——完美解决团队sql操作协同问题,此文是我以前的一个思考。

但是有三个缺点:

  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 依赖注入方法容器里获取数据库上下文

构造函数,通过依赖注入容器拿到数据库上下文。

    //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框架的数据库种子数据初始化的更多相关文章

  1. 利用代码生成工具生成基于ABP框架的代码

    在前面随笔,我介绍了整个ABP优化过框架的分层模型,包括尽量简化整个ABP框架的各个层的关系,以及纳入一些基类的辅助处理,使得我们对应业务分层类或者接口尽可能减少代码,并具有生产环境所需要的基类接口, ...

  2. 使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面

    世界上唯一不变的东西就是变化,我们通过总结变化的规律,以规律来应付变化,一切事情处理起来事半功倍.我们在开发后端服务代码,前端界面代码的时候,界面都是依照一定的规律进行变化的,我们通过抽取数据库信息, ...

  3. 在基于ABP框架的前端项目Vue&Element项目中采用电子签名的处理

    在前面随笔介绍了<在基于ABP框架的前端项目Vue&Element项目中采用电子签章处理文件和打印处理>的处理,有的时候,我们在流程中或者一些文件签署的时候,需要签上自己的大名,一 ...

  4. 基于ABP框架的SignalR,使用Winform程序进行功能测试

    在ABP框架里面,默认会带入SignalR消息处理技术,它同时也是ABP框架里面实时消息处理.事件/通知处理的一个实现方式,SignalR消息处理本身就是一个实时很好的处理方案,我在之前在我的Winf ...

  5. 在基于ABP框架的前端项目Vue&Element项目中采用日期格式处理,对比Moment.js和day.js的处理

    Day.js 是一个轻量的处理时间和日期的 JavaScript 库,和 Moment.js 的 API 设计保持完全一样. 如果您曾经用过 Moment.js, 那么您已经知道如何使用 Day.js ...

  6. 记录从数据库把数据初始化mongodb缓存的一些坑

    在项目启动时,需要做一些项目启动后的预操作,比如初始化数据进缓存等等. 这时就需要写listener,等监听.在项目启动时把数据缓存进mongodb. 但是这会有一个问题.项目一般都是把各种bean交 ...

  7. 基于ssh框架的highcharts前后台数据交互实例

    Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ...

  8. 基于ABP框架的权限设置

    需求:在界面展示中,"定向包管理","竞价管理","竞拍管理","发布定向资源","添加竞价资源", ...

  9. 在基于ABP框架的前端项目Vue&Element项目中采用电子签章处理文件和打印处理

    在一些内部OA或者流转的文件,或者给一些客户的报价文件.合同,或者一些医院出示的给保险机构的病历资料等,有时候可能都希望快速的使用电子签章的处理方式来给文件盖上特定的印章,本篇随笔介绍基于Vue&am ...

随机推荐

  1. GIS开源库OpenSceneGraph(OSG)、OSGEarth、GDAL、Qt、CGAL、Boost

    GIS开源有这些库:OpenSceneGraph(OSG).OSGEarth.GDAL.Qt.CGAL.Boost

  2. 二十七、rsync同步工具

    1.什么是rsync? Rsync是一款开源的.快速的,多功能的,可实现全量及增量的本地或者远程数据同步备份的优秀工具.windows和linux都可以. 官网:http:www.samba.org/ ...

  3. 吴裕雄--天生自然C语言开发:递归

    void recursion() { statements; ... ... ... recursion(); /* 函数调用自身 */ ... ... ... } int main() { recu ...

  4. Android 7.0终极开发者预览版全攻略!

    近日,Google的工程部副总裁Dave Burke在官方博客上正式发布开发者预览版5,此预览版是android 7.0 “牛轧糖”正式发布前最后一个预览版,同时也是在性能.功能上等多方面的表现上最接 ...

  5. vue表格业务

    https://www.jianshu.com/p/79f39f2c1382 https://blog.csdn.net/zhongshijun521/article/details/78390614 ...

  6. Java IO: PipedOutputStream

    原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) PipedOutputStream可以往管道里写入读取字节流数据,代码如下: 01 Outp ...

  7. PO设计模式-实现移动端自动化测试

    开发环境:python 3.6.5 + selenium 2.48.0 + pytest框架 + Android 5.1 工具:pycharm + Appium + Genymotion 测试机型:S ...

  8. if分支判断

    # 控制语句 分支 循环语句 # 判断语句 if ..elif..else # if 条件语句(比较 逻辑 成员运算) # 空数据 == False # 非空数据 == True age = 20 i ...

  9. 垃圾回收GC

    ​ 每种语言都有自己的垃圾回收机制.接下来我们来讲一下python的垃圾回收机制. 小整数对象池:python对小整数的定义为[-5,257),这些整数对象是提前建立好的,不会被垃圾回收.单个字母也一 ...

  10. MyBatis之pageHelper分页插件

    1.先导入Maven,jar包依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artifa ...