生成 CRUD 页面
当你添加一个现有项目或创建一个新项目时,该项目将列在"打开最近项目"部分。要选择项目,请点击项目名称。
请注意,ABP Suite 为每个项目生成一个唯一的 URL。选择项目后,你可以将其安全地添加到浏览器书签中以更快地访问。
实体信息
要创建新实体,请确保页面右上角实体组合框中选择了-新实体-。在本部分,你需要提供实体的元数据。不要为你的实体名称、复数名称、数据库表名或命名空间使用C#保留关键字。
实体类型:指定实体的类型。(master 或 child)
名称:实体的名称。
复数名称:实体的文件夹名称以及
DbContext中DbSet的名称。数据库表/集合名称:关系型数据库的数据库表名或NoSQL数据库的集合名称。
命名空间:实体、DTOs和其他
C#类的命名空间。页面标题:指定当前实体的页面标题。它将用作页面标题的本地化键,因此你稍后可以为不同语言进行本地化。
基类:ABP提供了几个开箱即用的基类。基本上有两种主要类型的实体:
AggregateRoot和简单的Entity。这两种类型还有两个带有Audited和FullAudited派生的变体。如果你的实体包含子实体,例如
Order及其OrderDetail实体,那么你应该选择AggregateRoot / AuditedAggregateRoot / FullAuditedAggregateRoot。如果它没有任何子实体,例如
City实体,你可以选择Entity / AuditedEntity / FullAuditedEntity。或者,如果你想创建一个不实现
IHasExtraProperties和IHasConcurrencyStamp接口(额外属性和并发检查)的聚合根,可以选择BasicAggregateRoot。Entity和AggregateRoot是底层简单的基类。
AuditedEntity和AuditedAggregateRoot向实体添加以下字段:
CreationTimeCreatorIdLastModificationTimeLastModifierId
因此,它会记录谁在何时创建和更改了数据。
FullAuditedEntity和FullAuditedAggregateRoot向实体添加以下字段:
CreationTimeCreatorIdLastModificationTimeLastModifierIdIsDeletedDeleterIdDeletionTime
它通过软删除功能扩展了审计实体的特性。当数据被删除时,它将
IsDeleted字段设置为true,而不是物理删除。ABP在数据获取时自动过滤掉软删除的数据。同时保存了谁在何时删除。
主键类型:主键是表或集合中的一个字段,用于唯一标识每条记录。ABP Suite允许你用4种类型之一创建实体:
Int、Long、Guid和String。ABP Suite推荐使用Guid,因为:- 你可以在应用层识别对象。
- 你可以在任何地方生成
ID,而无需往返于数据库。 - 更好的迁移和复制!与其他数据库一起工作时,由于在所有表、数据库和服务器中唯一,因此可以轻松迁移数据及其所有子实体。
- 允许轻松跨多个服务器分发数据库。
- 性能不像
String那样差,因为数据库系统能很好地处理Guid。 - 它由ABP按顺序生成,因此数据库中数据的物理顺序将是创建顺序。
Guid占用16字节。与占用4字节的Int相比,额外的12字节确实会带来成本。
另一方面,
Int和Long类型也有一些其他优势:- 存储占用空间小。
- 最佳的连接/索引性能。
- 对数据仓库有用。
- 操作系统的原生数据类型,易于在所有语言中使用。
可自定义代码:指定钩子点以允许添加自定义代码块。然后,你编写的代码块在下次实体生成时将不会被覆盖,并且会被尊重。
多租户:对于你的多租户应用程序,你可以将实体设置为多租户,这意味着数据将在租户之间隔离。为了使实体成为多租户,ABP Suite向实体添加
IMultiTenant接口。更多信息请参见多租户。- 如果你创建应用程序时支持分离租户模式,那么当你为实体启用多租户时,数据库配置(DbSet定义和模型配置)将在
MyProjectNameDbContext和MyProjectNameTenantDbContext(可用于租户特定配置)类中都定义。否则,数据库配置将仅为主机在MyProjectNameDbContext类中定义。
- 如果你创建应用程序时支持分离租户模式,那么当你为实体启用多租户时,数据库配置(DbSet定义和模型配置)将在
添加迁移:为新实体添加新迁移。如果你正在更新现有实体,它会创建更新迁移。
- 更新数据库:当你添加新迁移时,ABP Suite可以自动执行更新数据库命令,以便将更改应用到数据库。
创建用户界面:创建页面、模态框、组件、
JavaScript、CSS文件,并将新页面添加到主菜单。如果你不需要通过用户界面管理实体,可以取消选中此选项。Excel导出:创建一个按钮,将添加到实体的所有数据列表导出到Excel文件。
批量删除:根据指定条件执行记录的批量删除。
创建单元和集成测试:为你的实体生成单元和集成测试。
并发检查:实现实体的
IHasConcurrencyStamp接口。如果基类是AggregateRoot,则默认启用并发控制。更多详细信息请参阅并发检查文档。
属性
定义属性
属性是实体中的一个字段,它对应于关系型数据库表中的列或NoSQL数据库集合中的JSON字段。在属性部分,你可以管理实体的属性。要添加新属性,请点击页面右上角的"添加属性"按钮。
- 属性名称:字段的名称。不要使用C#保留关键字和数据库保留关键字。
- 属性类型:从列表中选择相关的属性类型。
- 默认值:为此属性每次创建时添加默认值。
- 最小-最大长度:这些值用于限制数据值。数据库列的长度也将考虑此数字创建。ABP根据这些值在客户端和服务器端验证数据。
- 正则表达式:为属性添加通用表达式。
- 邮箱验证:选择你的属性是否是邮箱并需要验证。
- 必填:定义是否需要值。
- 可过滤:将属性添加到高级搜索筛选器并包含在筛选器中。
- 文本区域:将属性设为文本区域以输入文本,例如描述。
- 可为空:允许你将属性设置为
C#支持的数据类型的nullable。
属性列表
为实体定义的所有属性的列表。你可以删除或编辑属性。
排序
你可以使用排序字段列来指定或更改结果的排序顺序。要进行排序,请点击要设置顺序索引的第一个组合框(排序索引)。选择升序或降序来指定列的排序顺序。
导航属性
导航属性是实体上的一种属性,允许从一个关联端导航到另一端。与普通属性不同,导航属性不携带数据。
导航属性提供了一种导航两个实体类型之间关联的方式。每个对象都可以对其参与的每个关系拥有一个导航属性。
当你使用ABP Suite创建导航属性时,你将拥有一个下拉菜单或查找表来从依赖记录列表中选择记录。ABP Suite允许你为**一对多 (1:N)和多对多 (N:N)**关系创建导航属性。
在这种场景中,一个实体的多条记录与另一个实体的单条记录相关联。这意味着你有一个主体(父)实体和许多依赖(子)实体。
让我们看一个例子来更深入地理解它...
我们将有一个Book实体和一个Author实体。假设每本书都有一个作者。
Book实体 (1) 关联到Author实体 (N)。
逐步创建导航属性(具有一对多关系)
让我们看看如何为书店项目创建导航属性。我们将创建一个Author实体和一个Book实体。Book实体将持有指向Author实体的外键,该外键将存储Author实体的主键。
要创建多对多关系,请查看创建多对多关系
1- 创建"Author"实体
Author实体是Book实体的依赖或子实体。因此,我们将首先创建Author实体。在实体信息标签页,在名称字段中输入"Author"。其余部分将自动填充。然后点击属性标签页并添加以下2个属性:
- 属性名称:
NameSurname, 属性类型:string - 属性名称:
Age, 属性类型:int
点击保存并生成按钮,等待ABP Suite创建页面。
完成后,运行Web项目并转到Authors页面。点击New Author按钮并添加以下3条记录:
- Name Surname:
Miguel de Cervantes, Age:40 - Name Surname:
Charles Dickens, Age:35 - Name Surname:
Antoine de Saint-Exupery, Age:45
2- 创建"Book"实体
Book是主体(父)实体。它将在AuthorId属性中持有对Author实体的引用。让我们在ABP Suite中创建Book实体。点击页面顶部实体下拉菜单中的-New entity-,并在名称字段中输入**"Book"。其余部分将自动填充。然后点击属性**标签页并添加2个属性:
- 属性名称:
Title, 属性类型:string - 属性名称:
Year, 属性类型:int
点击导航属性标签页。然后点击添加导航属性按钮。在打开的窗口中,点击选择依赖实体文本框。将弹出一个文件浏览器。找到我们在步骤1中先前创建的Author.cs。Author.cs位于src\Acme.BookStore.Domain\Authors目录中。选择文件后,几乎所有字段将自动填充,除了显示属性。从属性下拉菜单中选择NameSurname。它将写入显示属性文本框。最后检查其他字段,然后点击确定按钮。添加了一个新的导航属性。点击保存并生成按钮,等待ABP Suite创建带有导航属性的Books页面。
注意,几乎所有字段都按约定自动填充。如果你没有重命名
DTO名称、DbContext中的DbSet名称、导航属性名称或命名空间,此工具将自动设置所有必需的字段。另一方面,这些文本框不是只读的,因此你可以根据需求更改它们。
在下图中,你将看到导航属性字段与代码类的映射。
导航属性窗口字段说明
实体命名空间:要作为导航属性使用的依赖(子)实体的命名空间。例如:
Acme.BookStore.Authors。实体名称:依赖实体的名称。例如
Author。显示属性:依赖实体的属性名称,你想在UI上显示为显示文本。应该是一个字符串字段。例如:
NameSurname。主键:依赖实体的主键类型。例如:
Guid。DTO名称:依赖实体DTO的名称。例如:
AuthorDto。DTO命名空间:依赖实体DTO的命名空间。例如:
Acme.BookStore.Authors。集合名称:
DbContext中依赖实体的集合名称或DbSet名称。你可以从集合名称下拉菜单中选择你的集合名称。例如:Authors。属性名称:将在主体(父)实体中创建的属性名称。例如:
AuthorId。UI选择类型:指定设置导航值的方法。有两种类型:
- 模态框:值在模态窗口中设置。一个名为Pick的按钮将允许用户打开具有搜索功能的查找表。用户将能够从查找表中选择单条记录。建议用于数据量大的实体。
- 下拉菜单:下拉菜单将允许用户选择单条记录。建议用于数据量较少的实体。
导航属性的数据库结构
AppBooks表存储主体实体的项目,AppAuthors表存储依赖实体的项目。每本书都有一个AuthorId字段,引用Authors表。
最终效果
下图是ABP Suite创建的最终页面。新建书籍对话框有一个Author下拉菜单,列出了所有作者。保存书籍后,作者列将显示作者实体的NameSurname字段(显示属性)。
保存实体
有两种保存实体的选项。
保存
仅将实体另存为草稿,不生成代码。当你不希望将更改应用到项目时,这很有用。
保存并生成
保存实体并生成代码。你的项目将添加一个新的CRUD页面。
数据库表
当你点击保存并生成按钮时,它将创建所有相关对象。下面的截图是ABP Suite生成的MS-SQL数据库表。
与已安装的ABP模块的实体建立/创建关系
ABP Suite允许你与预装的ABP模块建立一对多关系。你可以通过勾选导航属性模型中的包含来自ABP模块的实体复选框,并选择相关模块实体,来添加预装ABP模块中的任何实体作为导航属性,如下图所示:
在上面的例子中,IdentityUser实体被选为导航属性。你可以在导航属性模型中选择已安装ABP模块中的任何实体。
注意: 在建立你自己的实体与模块实体之间的关系之前,请确保你的解决方案已正确构建,因为ABP Suite会扫描程序集并找到你正在使用的ABP模块,如果你已勾选包含来自ABP模块的实体复选框,则会在导航属性模型中列出它们的实体。
添加现有实体作为导航属性
或者,你可以通过手动输入所需信息,将IdentityUser实体(或任何其他实体)作为导航属性添加到实体中。见下图:
用户界面
新建书籍对话框
书籍列表页面
故障排除
如果无法生成Angular UI,应检查什么
在为使用最新版本Suite的遗留ABP应用程序生成CRUD页面之前,你可能需要进行一些调整。
检查你的环境变量是否定义了
rootNamespace,如此处所述。检查你的工作区配置是否满足以下条件之一。示例假设你的解决方案命名空间为
BookStore、Acme.BookStore或Acme.Retail.BookStore。- 项目键采用帕斯卡命名法。例如
BookStore。 - 项目键采用驼峰命名法。例如
bookStore。 - 项目键采用短横线命名法。例如
book-store。 - 项目被定义为
defaultProject。
- 项目键采用帕斯卡命名法。例如
通过命令行生成CRUD页面
你可以通过ABP CLI生成CRUD页面,而无需打开ABP Suite的用户界面。 为此,你需要将实体JSON文件和解决方案路径传递给ABP CLI。
示例:
abp suite generate --entity D:\Projects\BookStore\.suite\entities\Book.json --solution D:\Projects\BookStore\Acme.Bookstore.sln
在此示例中,Book.json是先前通过ABP Suite创建的。
参数
--entity或-e:实体JSON文件的路径。--solution或-s:目标解决方案文件(*.sln)的路径。
实体JSON文件是实体的元数据。它具有为实体生成CRUD页面所需的所有信息。当你在ABP Suite上生成实体时,你可以在解决方案的
.suite\entities文件夹中找到该实体的实体JSON文件。你可以直接使用该文件通过Abp CLI重新生成实体。当你将实体从一个解决方案复制到另一个具有不同命名空间的解决方案时,则可能需要更新实体JSON。原因是导航属性与其命名空间一起保存,因此你需要更新导航属性的命名空间。
抠丁客
















