原文作者:圣杰

原文地址:ABP入门系列(2)——领域层创建实体

在原文作者上进行改正,适配ABP新版本。内容相同

这一节我们主要和领域层打交道。首先我们要对ABP的体系结构以及从模板创建的解决方案进行一一对应。网上有代码生成器去简化我们这一步的任务,但是不建议初学者去使用。

一、首先来看看ABP体系结构

领域层就是业务层,是一个项目的核心,所有业务规则都应该在领域层实现。
实体(Entity): 实体代表业务领域的数据和操作,在实践中,通过用来映射成数据库表。
仓储(Repository): 仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。
领域服务(Domain service): 当处理的业务规则跨越两个(及以上)实体时,应该写在领域服务方法里面。
领域事件(Domain Event): 在领域层有些特定情况发生时可以触发领域事件,并且在相应地方捕获并处理它们。
工作单元(Unit of Work): 工作单元是一种设计模式,用于维护一个由已经被修改(如增加、删除和更新等)的业务对象组成的列表。它负责协调这些业务对象的持久化工作及并发问题。

二、再来看看解决方案

确定了解决方案下每个项目分别对应那一层后,我们开始创建Task实体。

三、创建Task实体

1.在领域层创建Tasks文件夹,并创建Task实体类;
2.ABP中所有的实体类都继承自Entity,而Entity实现了IEntity接口;而IEntity接口是一个泛型接口,通过泛型指定主键Id类型,默认的Entity的主键类型是int类型。
创建Task,肯定需要保存创建时间,可以通过实现审计模块中的IHasCreationTime来实现这种通用功能。代码如下:

 using Abp.Domain.Entities;
using Abp.Domain.Entities.Auditing;
using Abp.Timing;
using Coreqi.Authorization.Users;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text; namespace Coreqi.Tasks
{
public class Task : Entity, IHasCreationTime
{
public const int MaxTitleLength = ;
public const int MaxDescriptionLength = * ;
public long? AssignedPersonId { get; set; }
[ForeignKey("AssignedPersonId")]
public User AssignedPerson { get; set; } [Required]
[MaxLength(MaxTitleLength)]
public string Title { get; set; } [Required]
[MaxLength(MaxDescriptionLength)]
public string Description { get; set; } public TaskState State { get; set; } public DateTime CreationTime { get; set; } public Task()
{
CreationTime = Clock.Now;
State = TaskState.Open;
}
public Task(string title ,string description = null): this()
{
Title = title;
Description = description;
}
}
public enum TaskState : byte
{
Open = ,
Completed =
}
}

其中定义了TaskState状态枚举。并添加了AssignedPerson导航属性,用来保存分配任务到某个用户。其中[Required]、[MaxLength]特性是用来进行输入校验的。

3.定义好实体之后,我们就要去DbContext中定义实体对应的DbSet,以应用Code First 数据迁移。找到我们的基础服务层,即以EntityFramework结尾的项目中,找到DbContext类,添加以下代码

 using Microsoft.EntityFrameworkCore;
using Abp.Zero.EntityFrameworkCore;
using Coreqi.Authorization.Roles;
using Coreqi.Authorization.Users;
using Coreqi.MultiTenancy;
using Coreqi.Tasks; namespace Coreqi.EntityFrameworkCore
{
public class CoreqiDbContext : AbpZeroDbContext<Tenant, Role, User, CoreqiDbContext>
{
/* Define a DbSet for each entity of the application */
public DbSet<Task> Tasks { get; set; }
public CoreqiDbContext(DbContextOptions<CoreqiDbContext> options)
: base(options)
{
}
}
}

4.执行Code First数据迁移。

  • 打开程序包管理器控制台,默认项目选择Entityframework对应的项目后。执行Add-Migration Add_Task_Entity,创建迁移。
  • 创建成功后,会在Migrations文件夹下创建时间_Add_Task_Entity格式的类文件。
  • 在EntityFrameworkCore=》Seed=》Host目录下新建DefaultTaskCreator类用于预置两条Task种子数据。
 using Coreqi.Tasks;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Coreqi.EntityFrameworkCore.Seed.Host
{
public class DefaultTaskCreator
{
private readonly CoreqiDbContext _context; private static readonly List<Task> _tasks; public DefaultTaskCreator(CoreqiDbContext context)
{
_context = context;
} static DefaultTaskCreator()
{
_tasks = new List<Task>()
{
new Task("Learning ABP deom", "Learning how to use abp framework to build a MPA application."),
new Task("Make Lunch", "Cook 2 dishs")
};
} public void Create()
{
CreateTasks();
} private void CreateTasks()
{
foreach (var task in _tasks)
{
if (_context.Tasks.FirstOrDefault(t => t.Title == task.Title) == null)
{
_context.Tasks.Add(task);
}
_context.SaveChanges();
}
}
}
}

然后在InitialHostDbBuilder类中的Create方法中,添加以下代码。

         public void Create()
{
new DefaultEditionCreator(_context).Create();
new DefaultLanguagesCreator(_context).Create();
new HostRoleAndUserCreator(_context).Create();
new DefaultSettingsCreator(_context).Create(); //add
new DefaultTaskCreator(_context).Create(); _context.SaveChanges();
}

在程序包管理器控制台,输入Update-Database,回车执行迁移。执行成功后,运行xxxx.Web.Host项目,查看数据库,Tasks表创建成功,且表中已存在两条测试数据。

  至此,Task实体类成功创建。

ABP领域层创建实体的更多相关文章

  1. 2 abp 领域层创建实体

    领域层: LearningMpaAbp.Core项目   基础服务层:EntityFramework对应的项目 1 在领域层新建Tasks文件夹 在文件夹下新建Task类 但是注意 Task类必须要继 ...

  2. ABP入门系列(3)——领域层创建实体

    这一节我们主要和领域层打交道.首先我们要对ABP的体系结构以及从模板创建的解决方案进行一一对应.网上有代码生成器去简化我们这一步的任务,但是不建议初学者去使用. 一.首先来看看ABP体系结构 领域层就 ...

  3. ABP入门系列(2)——领域层创建实体

    ABP入门系列目录--学习Abp框架之实操演练 这一节我们主要和领域层打交道.首先我们要对ABP的体系结构以及从模板创建的解决方案进行一一对应.网上有代码生成器去简化我们这一步的任务,但是不建议初学者 ...

  4. abp(net core)+easyui+efcore仓储系统——领域层创建实体(三)

    abp(net core)+easyui+efcore仓储系统目录 abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一) abp(net core)+easyui+e ...

  5. ABP入门教程6 - 领域层创建实体

    点这里进入ABP入门教程目录 创建实体 在领域层(即JD.CRS.Core)下新建文件夹Entitys //用以存放实体对象添加一个实体类Course.cs //课程信息 using Abp.Doma ...

  6. ABP领域层知识回顾之---仓储

    1. 前言  在上一篇博文中 http://www.cnblogs.com/xiyin/p/6810350.html 我们讲到了ABP领域层的实体,这篇博文继续讲ABP的领域层,这篇博文的主题是ABP ...

  7. ABP(现代ASP.NET样板开发框架)系列之10、ABP领域层——实体

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之10.ABP领域层——实体 ABP是“ASP.NET Boilerplate Project (ASP.NET样板 ...

  8. ABP领域层——实体

    ABP领域层——实体 基于DDD的现代ASP.NET开发框架--ABP系列之10.ABP领域层——实体 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的 ...

  9. ABP领域层知识回顾之---实体

    标题:重温ABP领域层 1. 前言  最近一段时间一直在看<ABP的开发指南>(基于DDD的经典分层架构思想).因为之前一段时间刚看完<领域驱动设计:软件核心复杂性应对之道>, ...

随机推荐

  1. delphi将字符串转换成stringlist

    function StrToList(const sString, Token: string): TStringList;var sTmp: string; iPos: Integer; Tokle ...

  2. RabbitMQ的下载与安装

    RabbitMQ的安装注意事项: 1. 系统的管理员账户不能是中文(win8) 2. 计算机名不能是中文(win8) 3. 推荐:使用默认的安装目录 4. 使用的计算机用户必须是管理员 如果安装不成功 ...

  3. 爬虫之urllib库使用

    请求方法request import urllib.request url = "https://blog.csdn.net/fengxinlinux/article/details/772 ...

  4. OpsManage安装过程中遇到的问题和解决方案

    系统地址:https://github.com/welliamcao/OpsManage 系统:ubuntu ubuntu使用apt-get进行自动化安装 自带python2.7,不需要再次安装 1. ...

  5. python sqlite3学习笔记

    1.sqlite3.connect()参数说明 self.connect = sqlite3.connect(db_name,timeout=3,isolation_level=None,check_ ...

  6. 无线AP知识点

    FAT模式指该AP可以独立配置,有独立的管理界面,就像普通的无线AP:FAT模式主要用在没有使用AC的小型网络中. FIT模式指该AP由TP-LINK AC(无线控制器)统一管控设置.    1,这个 ...

  7. C++11正则表达式初探

    C++正则表达式 在此之前都没有了解过C++的正则,不过现在大多数赛事都支持C++11了,因此有必要学习一下,用于快速A签到题. 所在头文件 #include<regex> 正则表达式语法 ...

  8. Mybatis源码学习之反射工具(三)

    简述 MyBatis在进行参数处理.结果映射等操作时,会涉及大量的反射操作.Java中的反射虽然功能强大,但是代码编写起来比较复杂且容易出错,为了简化反射操作的相关代码,MyBatis提供了专门的反射 ...

  9. ARTS打卡计划第十四周

    Algorithms: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/ Review: “How to write ...

  10. canvas实现水印

    最近遇到一个需求,给所有页面加水印(登录人),不影响其他点击等功能的使用,目的是防止信息外漏,当时就在想:这年头,PS就不说人人都能使用,谁手机还没个涂鸦功能,防不了,但是就是这么个需求,那就实现吧! ...