几乎所有的业务应用程序都要适用一种数据库基础架构,用来实现数据访问逻辑,以便从数据库读取或写入数据,我们还需要处理数据库事务,以确保数据源中的一致性。
ABP框架可以与任何数据库兼容,同时它提供了EF Core和MongoDB的内置集成包。您将通过定义DbContext类、将实体映射到数据库表、实现仓储库以及在有实体时部署加载相关实体的不同方式,学习如何将EF Core与ABP框架结合使用。您还将看到如何将MongoDB用作第二个数据库提供程序选项。
本章介绍了ABP的基本数据访问架构,包括以下主题:
- 定义实体
- 定义D库
- EF核心集成
- 了解UoW
ABP通过接口和基类来标准化实体的定义
1 定义实体
1.1 聚合根类(AggregateRoot)
聚合一般包括多个实体或者值对象,聚合根可以理解为根实体或者叫主实体。聚合的概念我们会在后面第10节的DDD会详细讲到,这里只是做个大概了解。
在ABP框架中,您可以从一个AggregateRoot类派生来定义主实体和聚合根,BasicAggregateRoot是定义聚合根的最简单的类。
以下示例实体类派生自BasicAggregateRoot类:
namespace FormsApp
{
public class Form : BasicAggregateRoot<Guid> //
{
public string Name { get; set; }
public string Description { get; set; }
public bool IsDraft { get; set; }
public ICollection<Question> Questions { get; set; }
}
}
BasicAggregateRoot只是将Id属性定义为PK,并将PK类型作为泛型参数。在本例中,Form的PK类型是Guid。只要底层数据库支持,就可以使用任何类型作为PK(例如int, string等)。
还有其他一些基类可以从中派生聚合根,如下所述:
- AggregateRoot 有其他属性来支持乐观并发和对象扩展特性
- CreationAuditedAggregateRoot 继承自 AggregateRoot类,并添加 CreationTime (DateTime) 和 CreatorId (Guid) 属性来存储创建审核信息。
- AuditedAggregateRoot 继承* CreationAuditedAggregateRoot类,并添加 LastModificationTime (DateTime) 和LastModifierId (Guid)属性来存储修改审核信息。
- FullAuditedAggregateRoot继承自AuditedAggregateRoot类,并添加 DeletionTime (DateTime) 和 DeleterId (Guid) 属性来存储删除审核信息。它还通过实现ISoftDelete接口添加了IsDeleted (bool),实现实体软删除。
1.2 实体类(Entity)
Entity基类类似于AggregateRoot类,但它们用于子集合实体,而不是主(根)实体。例如,上面的Form聚合根示例包含一系列问题子实体集合,它派生自实体类,如以下代码段所示:
public class Question : Entity<Guid> //
{
public Guid FormId { get; set; }
public string Title { get; set; }
public bool AllowM