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

目录

  • Abp系列
  • 一.abp框架运行——前后端分离(基于VUE)
  • 二.基于abp框架的数据库种子数据初始化
  • 基于abp框架的数据库种子数据初始化
  • 1.背景
  • 2.参照
  • 3.解决方案
    • 3.1 初始化数据
    • 3.2 依赖注入方法容器里获取数据库上下文
    • 3.3 封装创建初始化数据列表方法
    • 3.4 数据库中没有的初始化数据,补充到数据库中去
  • 4.效果
  • 5. Area实体
  • 6.小结

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框架的种子数据种入数据库,会获取到数据库上下文,扫描出表中缺失的数据,补录丢失的某条或者某几条记录。

原文地址:https://www.cnblogs.com/JerryMouseLi/p/12427973.html

时间: 2024-10-07 02:06:32

基于abp框架的数据库种子数据初始化的相关文章

基于MyBatis框架链接数据库

基于Mybatis框架 特点:给予MyBatis框架半成品 站在巨人肩膀上 连接访问数据库,封装成工具类 方便调用连接 减少代码的冗余 提高效率 支持多线程并发访问 public class BatisUtil { private static final ThreadLocal<SqlSession> thl = new ThreadLocal<SqlSession>(); private static SqlSessionFactoryBuilder builder =null

Entity Framework应用:使用Code First模式管理数据库创建和填充种子数据

一.管理数据库连接 1.使用配置文件管理连接之约定 在数据库上下文类中,如果我们只继承了无参数的DbContext,并且在配置文件中创建了和数据库上下文类同名的连接字符串,那么EF会使用该连接字符串自动计算出数据库的位置和数据库名.比如,我们的数据库上下文定义如下: 1 using System; 2 using System.Collections.Generic; 3 using System.Data.Entity; 4 using System.Linq; 5 using System.

详解ABP框架的多租户

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:ABP框架对多租户场景提供了很好的支持,内建了多租户的处理机制,今天我们来深入解析一下这一特性. 最近在基于ABP框架(ASP.NET Boilerplate)开发了一个SaaS.所以接下来可能会时不时分享一下ABP方面的文章.今天来介绍一下ABP对多租户提供的支持特性. ABP简介 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个

ABP框架用Dapper实现通过SQL访问数据库

为了防止不提供原网址的转载,特在这里加上原文链接:http://www.cnblogs.com/skabyy/p/7517397.html 本篇我们实现数据库的访问.我们将实现两种数据库访问方法来访问一个SQLite数据库--使用NHibernate实现的ORM映射访问和使用Dapper实现的SQL语句访问.然后完成前一篇未完成的CreateTweet和GetTweets接口. 在开始之前,先做一些准备工作,新建Domain层的Module: public class MyTweetDomain

手工搭建基于ABP的框架 - 工作单元以及事务管理

一个业务功能往往不只由一次数据库请求(或者服务调用)实现.为了功能的完整性,我们希望如果该功能执行一半时出错,则撤销前面已执行的改动.在数据库层面上,事务管理实现了这种完整性需求.在ABP中,一个完整的业务功能称为一个工作单元(Unit of Work,简称UoW).工作单元代表一种完整的.原子性的操作.即一个工作单元包含的步骤要么全部被执行,要么都不被执行.如果执行一半时出现异常,则必须讲已执行的步骤还原.通常我们将事务管理实现在工作单元中.下面我们从ABP源码入手研究如何使用工作单元. AB

8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解

本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to Entities 使用LINQ to Entities操作实体 LINQ操作 懒加载和预加载 插入数据 更新数据 删除数据 本章小结 本人的实验环境是VS 2013 Update 5,windows 10,MSSQL Server 2008. 上一篇<Code First开发系列之领域建模和管理实体关系>,我们主要介绍了EF中“约定大于配置”的概念,如何创建数据

基于Bootstrap框架的临床数据管理系统的设计与开发

    基于Bootstrap框架的临床数据管理系统的设计与开发     2018年11月10日 目  录 第一章绪论... 6 1.1 选题背景及其意义... 6 1.2国内外研究现状... 7 1.2.1 临床大数据管理系统发展现状... 7 1.2.2医疗电子表单管理发展现状... 8 1.3研究目标... 9 1.4 研究内容... 10 1.5论文整体结构... 10 第二章相关技术研究... 12 2.1 AngularJS技术简述... 12 2.2 RESTful API +sw

PHP 基于laravel框架获取微博数据之一 模拟新浪微博登录

参考资料:http://www.csuldw.com/2016/11/10/2016-11-10-simulate-sina-login/http://blog.csdn.net/fly_leopard/article/details/51148904http://www.tuicool.com/articles/uIJzYff http://blog.csdn.net/u010029983/article/details/46364113等 模拟新浪微博登录是抓取新浪数据的基础,网上的参考资料

HighCharts绘制JS折线图(后台传数据给前台基于JFinal框架)

/*****************************Controller(基于JFinal框架)**************/ package com.zzu.controller;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.List;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartUtilitie