ABP框架第一课-实体的创建

ABP框架的 ABP.Web.Host,是可以显示所有接口,并调试接口的前端界面。

 

 

我们一步一步来

第一步:我们先不要急去配置数据库什么的,首先先得到一个接口

我们在Application层创建一个文件夹Test(主要为来好区分,不用太乱)

ABP框架第一课-实体的创建

然后创建一个类TestApplicaticationService,(命名后缀为 ApplicaticationService :为什么呢?按规矩来总有好处,因为ABP框架可以根据这个后缀名进行自动的依赖注入,这都是后话与本篇无关)

ABP框架第一课-实体的创建

这个类基础 (自己的项目名)AppServiceBase

ABP框架第一课-实体的创建

然后,我们在这个类中输入一个方法,就得到一个接口了

ABP框架第一课-实体的创建

我们运行一下

ABP框架第一课-实体的创建

就可以看到我们创建的接口了

ABP框架第一课-实体的创建

ABP框架第一课-实体的创建

第二步:现在我们有一个接口了。那么就开始配合EF层(源于EntityFrameworkCore框架),配操作我们的数据库了

虽然与EF层有关,但是我们不用修改EF层,因为ABP框架帮我们封装好了。但是要配置好数据库哦(这里就不展开了。详细看这里)

http://note.youdao.com/noteshare?id=83ef71bae5afa5ff9ada352398274f2a&sub=EEBA6AF23F214D2BB3ECA966E91FB58E

 

我们只需要在Core层,创建对应的实体就好了

创建一个Tests文件夹(为了整洁),创建一个Testdata的实体类

ABP框架第一课-实体的创建

然在实体创建,几个列,

我们继承了:FullAuditedEntity的具体作用可以参考这个

http://note.youdao.com/noteshare?id=0ed4659b7beccb49999664faa67939e5&sub=WEB28d32e2226877eaf8791c76bf4702fd6

ABP框架第一课-实体的创建

[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实例化,不详细讲),把实体引进来

ABP框架第一课-实体的创建

然后写一个 得到全部表信息的接口

_entityRepository可以理解为,你的数据库表

.GetAllListAsync()是ABP框架封装好给你的异步查询全部的方法(有关多线程的知识)

.GetAll()是ABP封装的非异步封装方法(不用多线程)

ABP框架第一课-实体的创建

然后查询接口就完成了

ABP框架第一课-实体的创建

但是数据库操作有很多,用封装好的查询方法是满足不了我们的

所有我们可以用Linq或者Lambda语句进行,查询的进阶,剩下的就是Linq或Lambda的知识了

ABP框架第一课-实体的创建 也可以用Lambda

ABP框架第一课-实体的创建

第三步:查询的完成我们就已经完成了一大步了,接下来就是创建和修改了

上面的步骤还不足以完成创建和修改

我们需要创建几个类,告诉EF层我们要创建什么,建一个DTo文件夹

ABP框架第一课-实体的创建

CreateOrUpdayaTestInput,是为了输入创建信息的时候更加方便的。

TestEditDto:是创建的时候输入的内容,和Test实体一样就可以了

TestListDto:是修改的时候输入的内容,和Test实体少了个: FullAuditedEntityDto,多了个  public int? Id { get; set; };因为: FullAuditedEntityDto中的列是不需要修改的

具体实现

CreateMappings:是用于映射创建和修改的动作的

ABP框架第一课-实体的创建

和Test实体一样

ABP框架第一课-实体的创建

和Test实体少了个: FullAuditedEntityDto,多了个  public int? Id { get; set; }

ABP框架第一课-实体的创建

映射创建和修改的动作的

ABP框架第一课-实体的创建

最后一步

Application层下的:OKABPApplicationModule.cs

中的 PreInitialize 方法中:

// 自定义类型映射

ABP框架第一课-实体的创建

然后我们就可以愉快地创建和修改了

 

        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));

        }