ABP(ASP.NET Boilerplate Project),现下比较流行的一种web框架,因为公司新项目准备使用这种框架,所以写下这篇文章记录下自己一步一步搭建的过程,就当做是对学习的一个总结与分享。

第一步:通过boilerplate模版创建解决方案
ABP框架官网:http://www.aspnetboilerplate.com/ .
可供选择的体系结构有两种:
1.Single Page Web Application :单页面应用程序
2.Muli Pate Web Application:多页面应用程序

在另外一篇博客中看到说可以选择的ORM框架有两种:EF和Nhibernate.但是官网上只看到EF.所以暂时选择EF框架。
模板使用多页面应用程序,所以选择第二个。单页面应用程序需要学习Angular.js.
下面有一个勾选框,勾选之后ABP框架模板会自动生成用户、角色、权限等方面的管理。输入解决方案名称,点击【Create My Project】生成解决方案,然后会提示下载解决方案的压缩包。

第二步:创建实体(Entity)

打开下载下来的模板 —>【还原Nuget包】,解决方案总共包含5个项目,大致可以分为4层。关于这几层具体的划分,用得多了,自然也就清楚了。

应用服务层(application):提供应用服务方法给表现层调用。
领域层(core):包括业务对象和业务规则,这是应用程序的核心层
基础设施层(EntityFramework):实现领域层中定义的仓储,数据库迁移以及数据交互等。
表现层(web,webApi):与用户打交道的一层。

在Core这一层创建两个实体,Teacher和Student继承自ABP的entity。ABP的entity自带一个Id(int)属性,默认作为主键。我们自己可以根据需要设置主键类型。
ABP基于模块编程,建议每个模块创建一个文件夹,相关的文件放在一起。所以在Core下面创建Teacher和Student文件夹,然后在对应的文件夹下创建实体。

public class Student:Entity<long>
{
public virtual string Code { get; set; }
public virtual string Name { get; set; }
}

public class Teacher : Entity
{
public virtual string Code { get; set; }
public virtual string Name { get; set; }
}

第三步:数据迁移

一般框架都采用DBFrist的模式,即先创建数据库,然后使用代码生成工具(如:动软, CodeSmith..)生成对应的Model.
ABP框架则采用CodeFirst的模式,即先创建对应的model,然后使用数据迁移功能,创建DB。当然有一个不太好的地方就是,以后不能手动修改数据库,否则会导致数据迁移出错。

接下来通过我自己做的demo来说明数据迁移的准备工作(数据库:postgresql):

1.创建数据库连接字符串,既然要做数据迁移这个当然是必须的。打开web中的TestProject.Web中的web.config。找到connectionStrings节点,节点下面有一个默认的连接,修改连接的字符串。这个name的是可以修改的,但是需要注意的是必须和DBContext中使用的name保持一致。打开TestProject.EntityFramework下的TestProjectDBContext,即可看到使用链接的name

<connectionStrings><add name="Default" connectionString="Server=192.168.XXX.XXX;Port=XXX;User Id=***;Password=***$;Database=**;" providerName="Npgsql" /></connectionStrings>
1
2.配置EntityFramework,在web.config中找到entityFramework节点,从ABP下载下来的模板中提供了默认的SqlServer的provider,根据需要配置自己所对应的provider,我的demo使用的postgresql,postgresql还需要在添加节点system.data,否则会出现错误.

<entityFramework>
<!--<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>-->
<defaultConnectionFactory type="Npgsql.NpgsqlConnectionFactory, EntityFramework6.Npgsql" />
<providers>
<provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
</providers>
</entityFramework>

<system.data>
<DbProviderFactories>
<remove invariant="Npgsql" />
<add invariant="Npgsql" name="Npgsql Data Provider" support="FF" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" />
</DbProviderFactories>

有可能出现的错误:未解析成员“Npgsql.PostgresException,Npgsql, Version=3.1.2.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7”的类型,

3.配置完毕,就可以开始数据迁移了。打开解决方案的【程序包管理控制台】,把默认项目切换到TestProject.EntityFramework。否则命令不能运行

4.运行add-migration命令,这个命令后面需要添加一个参数,参数需要符合C#的命名规范,所以输入add-migration entity回车运行。
第一次运行这个命令的时候,可能会出现错误:Unable to generate an explicit migration because the following explicit migrations are pending: [201701271145151_AbpZero_Initial]. Apply the pending explicit migrations before attempting to generate a new explicit migration.
把EntityFramework下面这个文件删除就可以了。然后重新运行。生成成功之后会看到EntityFramework会新增一个cs文件

打开这个文件,就可以看到对应的迁移的语句了。这个操作只会生成对应的文件,并不会修改数据库结构。

5.运行update-database更新数据库结构,完成数据迁移。

一些可能出现的错误和需要注意的地方:

1.An error occurred accessing the database.连接数据库错误,这个就可能是第三步中连接字符串配置出现了错误。

2.未解析成员“Npgsql.PostgresException,Npgsql, Version=3.1.2.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7”的类型
—有一种可能就是NpgSql和EntityFramework6.Npgsql的暗转顺序不对,重新卸载安装就可以了。
但还有一种比较隐蔽的错误就是数据迁移时生成的文件中数据类型的长度超出数据库类型所允许的长度:JobArgs = c.String(nullable: false, maxLength: 10485760)

3.数据迁移完成之后,数据库会对应生成创建的实体以及数据迁移历史记录表__MigrationHistory。这一张表是用来对比两次数据迁移时实体的变化,以便生成对应的数据迁移实体。每一次数据迁移的时候,都会与__MigrationHistory中最后一条记录做对比,以便生成相应的实体。也就是说这张表中的最新一条数据时不能够被删除的。

ABP(ASP.NET Boilerplate Project)学习总结的更多相关文章

  1. ABP(ASP.NET Boilerplate Project)快速入门

    前言 这两天看了一下ABP,做个简单的学习记录.记录主要有以下内容: 从官网创建并下载项目(.net core 3.x + vue) 项目在本地成功运行 新增实体并映射到数据库 完成对新增实体的基本增 ...

  2. 如何使用ASP.NET Core、EF Core、ABP(ASP.NET Boilerplate)创建分层的Web应用程序(第一部分)

    本文是为了学习ABP的使用,是翻译ABP官方文档的一篇实战教程,我暂时是优先翻译自己感兴趣或者比较想学习的部分,后续有时间希望能将ABP系列翻译出来,除了自己能学习外,有可能的话希望帮助一些英文阅读能 ...

  3. ABP(ASP.NET Boilerplate Project)框架探讨

    从官网上下载下来带Module-Zero的abp框架. vs2015打开解决方案. 首先让系统run起来.把webconfig数据库连接改一下.启动程序. 发现报错:“本地语言指定”的错误,之后运行n ...

  4. Asp.Net Boilerplate Project (ABP) 视频教程

    转自youtube:https://www.youtube.com/playlist?list=PLlu_PkRHZce-EtuVO1zVQpNgrB7Hiu1vu 虽然全部都没有声音,但看操作还是可 ...

  5. ABP之什么是ABP(ASP.NET Boilerplate)

    1.介绍 ABP是开源的且文档比较齐全的应用程序框架.其实它不仅仅是个框架,考虑其最佳实践,ABP更提供了基于领域驱动设计(DDD)的强大价格模型. ABP支持最新的ASP.NET Core和EF C ...

  6. Asp.Net Boilerplate Project 使用swagger调试api

    文件有点大,去掉了packages文件夹,(Swashbuckle.Core.5.6.0) 链接:https://pan.baidu.com/s/1DzMLhFyRav0dufS4dTeMzg 提取码 ...

  7. ASP.NET Boilerplate终于发布v1.0了

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:ABP经过2年多的开发,终于发布第一个主要版本了,谨此提醒ABP的使用者. ASP.N ...

  8. 十一、ASP.NET Boilerplate

    一.ASP.NET Boilerplate 实体是 DDD(领域驱动设计)的核心概念之一.Eric Evans 是这样描述的“很多对象不是通过它们的属性定义的,而是通过一连串的连续性事件和标识定义的” ...

  9. ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成

    ASP.NET Boilerplate 学习   1.在http://www.aspnetboilerplate.com/Templates 网站下载ABP模版 2.解压后打开解决方案,解决方案目录: ...

随机推荐

  1. JS 将数字字符串数组转为 数字数组 (互换)

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; arr.map(String); //结果: ['1', '2', '3', '4', '5', '6', '7', '8 ...

  2. Ubuntu 19.04 安装docker

    配置国内源: deb https://mirrors.ustc.edu.cn/ubuntu/ disco main restricted universe multiverse deb https:/ ...

  3. 数据结构之LinkList

    1.结构: 2.Link代码: public class Link { public int iData; public double dData; public Link next; public ...

  4. [技术博客] 自制 apt deb Repository

    [技术博客] 自制 apt deb Repository (termux) 在修改整合遵循GPLv3的Android terminal app and Linux environment:termux ...

  5. 【转】Android Fastboot 与 Recovery 和刷机

    1. 首先来看下Android系统的分区:   Android系统的分区.jpg   Android分区解释.png 安卓系统一般把rom芯片分成7个区,如果再加上内置sd卡这个分区,就是8个: hb ...

  6. <c:forEach>, <c:forTokens> 标签

    这些标签封装了Java中的for,while,do-while循环. 相比而言,<c:forEach>标签是更加通用的标签,因为它迭代一个集合中的对象. <c:forTokens&g ...

  7. [原]JSON 字符串(值)做判断,比较 “string ”

    现在我这样一个json字符串: char* cjson = "{\"code\": \"200\", \"code2\": 200 ...

  8. 分布式事务一2PC

    分布式事务解决方案之2PC(两阶段提交) 前面已经学习了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC.TCC.可靠消息最终一致性.最大努力通知这几种. 3.1.什 ...

  9. redis支持远程接入的安全防护问题

    如果我们没有启用保护模式,支持远程接入,启用默认端口6379,而且是用root用户启动的,那么基本上redis就是在裸奔了,人家分分钟搞你没商量. 我们模拟一下,现在机器A(ip假设为10.100.1 ...

  10. start & stop kafka cluster shell script

    kafka_start_cluster.sh #!/bin/bash brokers="kafka-server-1 kafka-server-2 kafka-server-3" ...