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. python_检测一些特定的服务端口有没有被占用

    一个python端口占用监测的程序,该程序可以监测指定IP的端口是否被占用. #!/usr/bin/env python# -*- coding:utf-8 -*- import socket, ti ...

  2. ZOJ-1610 Count the Colors(线段树染色,求染色段)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 https://vjudge.net/contest/318019# ...

  3. 十三、linux-mysql的mysql的核心优化思想

    一.数据库运维管理思想核心 1.未雨绸缪,不要停留在制度上,而是要实际做出来 2.亡羊补牢,举一反三,不要好了伤疤忘了疼 3.完善的框架设计及备份.恢复策略 4.定期思考,并实战模拟以上策略演练 二. ...

  4. UUID与时间戳

    /** * 32位去除'-'的UUID */ public static String getUUID() { String uuid = java.util.UUID.randomUUID().to ...

  5. Android activity 亮度调整

    注意点 screenBrightness 取值范围0-1 不是0-255一定要注意 scanForActivity(context) 是根据上下文获取所在的activity如果直接在activity ...

  6. spring-mvc基于注解的配置

    将配置文件修改为: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...

  7. ios 中键盘被遮挡解决方案

    1.当view是非可以滚动的view时, // 添加对键盘的通知 - -(void)viewDidLoad{ [[NSNotificationCenter defaultCenter] addObse ...

  8. Spring Security Config : 注解 EnableWebSecurity 启用Web安全

    https://blog.csdn.net/andy_zhang2007/article/details/90023901

  9. 吴裕雄--天生自然python学习笔记:python OpenCV 基本绘图

    Open CV 提供了绘制直线.圆形.矩形等基本绘 图的功能 . Open CV 画直线的语法为: 在画布上添加文字的语法为 : 用 Open CV 绘制基本图形 以 OpenCV 基本绘图绘制各种图 ...

  10. Cow Routing(最短路spfa)

    题:https://www.luogu.org/problem/P3115 题意:给出起点A,终点B,N条路线,下面没俩行一个路线,第一行是俩个数,第一个为这条路线的花费,第二个为这条路线经过的点数n ...