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. uniapp - 更改项目生成模板、页面

    每次生成项目目录都需要删除一些再添加太麻烦了,就想着能不能修改一下模板 - 当然自定义模板也能实现 好了,被我找到了. 修改以后源文件名称和格式覆盖回去即可,重新启动hbuilderx 这里可以修改e ...

  2. Unity制作地形的常用插件之GAIA

    用Unity制作大型游戏少了地形制作怎么行,用原生的Unity工具制作地形效率较低而且也不甚美观,后期运行的效率也得不到保证.下面推荐的专业地形制作工具可以帮助开发者解决地形制作的相关问题. 打开Un ...

  3. Asynchronous method in while loop 构造异步调用链

    Asynchronous method in while loop https://stackoverflow.com/questions/43064719/javascript-asynchrono ...

  4. sublime px转rem的方法【亲测有效】

    在开发手机网站的时候,我们经常会用到rem来作为单位,但是手动转rem太麻烦了,那么怎么办呢?sublime安装cssrem来进行快捷操作. 安装过程: 第一步:去git上克隆 https://git ...

  5. canvas笔记备忘

    备忘 1. canvas标签的宽和高设置是标签属性设置, 不是 css 属性设置. 如果用 css 属性设置大小, canvas 会被拉伸. 标签属性例如: class, id, style, wid ...

  6. Linux内核链表——看这一篇文章就够了

    本文从最基本的内核链表出发,引出初始化INIT_LIST_HEAD函数,然后介绍list_add,通过改变链表位置的问题引出list_for_each函数,然后为了获取容器结构地址,引出offseto ...

  7. osgearth显示中文标签

    首先将带有中文的字符串转换成string void unicodeToUTF8(const wstring &src, string& result){int n = WideChar ...

  8. js 动态加载 jq

    var script=document.createElement("script"); script.type="text/javascript"; scri ...

  9. Egret自定义位图文字(自定义+BitmapLabel)

    一 自定位图文字 因为egret的位图文字是texturemerger做的,需要多张单图片导入tm,然后导出两个文件来使用,过程比较麻烦. 而Laya的位图文字则是一张整图数字图片,使用FontCli ...

  10. 一次升级jar包遇到的空指针异常

    今天自己在升级公司的一个jar后,一直报空指针异常.代码如下 package com.zhuanche.http; import com.alibaba.fastjson.JSON; import c ...