ABP框架第一课-实体的创建
ABP框架的 ABP.Web.Host,是可以显示所有接口,并调试接口的前端界面。
我们一步一步来
第一步:我们先不要急去配置数据库什么的,首先先得到一个接口
我们在Application层创建一个文件夹Test(主要为来好区分,不用太乱)
然后创建一个类TestApplicaticationService,(命名后缀为 ApplicaticationService :为什么呢?按规矩来总有好处,因为ABP框架可以根据这个后缀名进行自动的依赖注入,这都是后话与本篇无关)
这个类基础 (自己的项目名)AppServiceBase
然后,我们在这个类中输入一个方法,就得到一个接口了
我们运行一下
就可以看到我们创建的接口了
第二步:现在我们有一个接口了。那么就开始配合EF层(源于EntityFrameworkCore框架),配操作我们的数据库了
虽然与EF层有关,但是我们不用修改EF层,因为ABP框架帮我们封装好了。但是要配置好数据库哦(这里就不展开了。详细看这里)
http://note.youdao.com/noteshare?id=83ef71bae5afa5ff9ada352398274f2a&sub=EEBA6AF23F214D2BB3ECA966E91FB58E
我们只需要在Core层,创建对应的实体就好了
创建一个Tests文件夹(为了整洁),创建一个Testdata的实体类
然在实体创建,几个列,
我们继承了:FullAuditedEntity的具体作用可以参考这个
http://note.youdao.com/noteshare?id=0ed4659b7beccb49999664faa67939e5&sub=WEB28d32e2226877eaf8791c76bf4702fd6
[Table(“Test”)]是你再数据库的表名
为了更加简洁,我们就不使用数据迁移了,我们直接在数据库用脚本创建对应的表
USE [OKABPDb]
GO
/****** Object: Table [dbo].[issue] Script Date: 2019/1/11 14:38:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Test](
--是继承:FullAuditedEntity,多出来的,必须添加
[Id] [int] IDENTITY(1,1) NOT NULL,
[CreationTime] [datetime2](7) NOT NULL,
[CreatorUserId] [bigint] NULL,
[LastModificationTime] [datetime2](7) NULL,
[LastModifierUserId] [bigint] NULL,
[IsDeleted] [bit] NOT NULL,
[DeleterUserId] [bigint] NULL,
[DeletionTime] [datetime2](7) NULL,
--以下是你自己的列
[Aname] [nvarchar](max) NULL,
[Asite] [nvarchar](max) NULL,
[AstartTime] [datetime2](7) NOT NULL,
[AendTime] [datetime2](7) NOT NULL,
[AdateTime] [datetime2](7) NOT NULL,
[Applynumber] [int] NOT NULL,
[Anumber] [int] NOT NULL,
[Astate] [int] NOT NULL,
[Aimage] [nvarchar](max) NULL,
[Atype] [int] NOT NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
我们拥有了实体,就可以对数据库进行查询了(因为映射ABP框架已经封装好了)
首先通过依赖注入(可以理解为new实例化,不详细讲),把实体引进来
然后写一个 得到全部表信息的接口
_entityRepository可以理解为,你的数据库表
.GetAllListAsync()是ABP框架封装好给你的异步查询全部的方法(有关多线程的知识)
.GetAll()是ABP封装的非异步封装方法(不用多线程)
然后查询接口就完成了
但是数据库操作有很多,用封装好的查询方法是满足不了我们的
所有我们可以用Linq或者Lambda语句进行,查询的进阶,剩下的就是Linq或Lambda的知识了
也可以用Lambda
第三步:查询的完成我们就已经完成了一大步了,接下来就是创建和修改了
上面的步骤还不足以完成创建和修改
我们需要创建几个类,告诉EF层我们要创建什么,建一个DTo文件夹
CreateOrUpdayaTestInput,是为了输入创建信息的时候更加方便的。
TestEditDto:是创建的时候输入的内容,和Test实体一样就可以了
TestListDto:是修改的时候输入的内容,和Test实体少了个: FullAuditedEntityDto,多了个 public int? Id { get; set; };因为: FullAuditedEntityDto中的列是不需要修改的
具体实现
CreateMappings:是用于映射创建和修改的动作的
和Test实体一样
和Test实体少了个: FullAuditedEntityDto,多了个 public int? Id { get; set; }
映射创建和修改的动作的
最后一步
Application层下的:OKABPApplicationModule.cs
中的 PreInitialize 方法中:
// 自定义类型映射
然后我们就可以愉快地创建和修改了
public async Task CreateOrUpdate(CreateOrUpdateTestInput input)
{
if (input.Test.Id.HasValue)
{
await Update(input.Test);
}
else
{
await Create(input.Test);
}
}
/// <summary>
/// 新增
/// </summary>
protected virtual async Task<TestEditDto> Create(TestEditDto input)
{
//TODO:新增前的逻辑判断,是否允许新增
// var entity = ObjectMapper.Map <issue>(input);
var entity = input.MapTo<Testdata>();
entity = await _entityRepository.InsertAsync(entity);
return entity.MapTo<TestEditDto>();
}
/// <summary>
/// 编辑
/// </summary>
protected virtual async Task Update(TestEditDto input)
{
//TODO:更新前的逻辑判断,是否允许更新
var entity = await _entityRepository.GetAsync(input.Id.Value); //根据ID找到对应要修改的数据
input.MapTo(entity);//把输入的input映射到entity中,MapTo的具体作用请百度
// ObjectMapper.Map(input, entity);
await _entityRepository.UpdateAsync(entity); //把实体传入到修改方法
}
第四步:增删查改,我们还确少删除
ABP为我们提供了批量删除,和单个删除2个方法
(那我们不想根据ID删除,想根据名字(name)怎么办呢?,那就用查询方法用name查出ID呀)
public async Task Delete(EntityDto<int> input)
{
//TODO:删除前的逻辑判断,是否允许删除
await _entityRepository.DeleteAsync(input.Id);
}
/// <summary>
/// 批量删除ActivityApply的方法
/// </summary>
public async Task BatchDelete(List<int> input)
{
// TODO:批量删除前的逻辑判断,是否允许删除
await _entityRepository.DeleteAsync(s => input.Contains(s.Id));
}