- 关于本教程
- 下载源代码
- 创建解决方案
- 创建书籍实体
- BookType枚举
- 将图书实体添加到DbContext
- 将图书实体映射到数据库表
- 添加数据库迁移
- 添加样本种子数据
- 更新数据库
- 创建应用程序服务
- BookDto
- CreateUpdateBookDto
- IBookAppService
- BookAppService
- 自动API控制器
- Swagger UI
- 下一部分
本教程基于版本3.1
在本教程系列中,您将构建一个名为Acme.BookStore
的基于ABP的Web应用程序。该应用程序用于管理书籍及其作者的列表。它是使用以下技术开发的:
- 实体框架核心作为ORM提供者。
- MVC/Razor页面作为UI框架。
本教程分为以下部分:
第1部分:创建服务器端(此部分)
第2部分:图书列表页面
第3部分:创建、更新和删除书籍
第4部分:集成测试
第5部分:授权
第6部分:作者:领领域层
第7部分:作者:数据库集成
第8部分:作者:应用程序层
第9部分:作者:用户界面
第10部分:书与作者的关系
下载源代码MVC (Razor Pages) UI with EF Core
创建解决方案在开始开发之前,请按照入门教程来创建一个名为Acme.BookStore
的新解决方案并运行它。
启动模板中的领域层分为两个项目:
Acme.BookStore.Domain
包含您的实体,领域服务和其他核心域对象。Acme.BookStore.Domain.Shared
包含constants
,enums
或其他领域相关的那些能够与客户共享的对象。
因此,在解决方案的领域层(Acme.BookStore.Domain
项目)中定义您的实体。
应用程序的主要实体是Book
。在Acme.BookStore.Domain
项目中创建一个Books
文件夹(命名空间),并在其中添加一个Book
类:
using System;
using Volo.Abp.Domain.Entities.Auditing;
namespace Acme.BookStore.Books
{
public class Book : AuditedAggregateRoot
{
public string Name { get; set; }
public BookType Type { get; set; }
public DateTime PublishDate { get; set; }
public float Price { get; set; }
}
}
-
ABP框架为实体提供了两个基本基类:
AggregateRoot
和Entity
。聚合根是域驱动设计概念,可以将其视为直接查询和使用的根实体(有关更多信息,请参见实体文档)。 -
Book
从实体继承了AuditedAggregateRoot
,其在AggregateRoot
类的顶部添加了一些基本的审计属性(比如CreationTime
,CreatorId
,LastModificationTime
…)。ABP会自动为您管理这些属性。 -
Guid
是主键类型的Book
实体。
为了简单起见,本教程将实体属性使用public get / set修饰。如果您了解有关DDD最佳做法的更多信息,请参见实体文档。
BookType枚举该Book
实体使用BookType
枚举。在Acme.BookStore.Domain.Shared
项目中创建一个Books
文件夹(命名空间)并在其中添加一个BookType
内部文件:
namespace Acme.BookStore.Books
{
public enum BookType
{
Undefined,
Adventure,
Biography,
Dystopia,
Fantastic,
Horror,
Science,
ScienceFiction,
Poetry
}
}
最终的文件夹/文件结构应如下所示:
EF Core要求将实体与您的DbContext
关联。最简单的方法是在Acme.BookStore.EntityFrameworkCore
项目的BookStoreDbContext
类中添加一个DbSet
属性,如下所示:
public class BookStoreDbContext : AbpDbContext
{
public DbSet Books { get; set; }
//...
}
将图书实体映射到数据库表
在Acme.BookStore.EntityFrameworkCore
项目中打开BookStoreDbContextModelCreatingExtensions.cs
文件,然后添加Book
实体的映射代码。最终类应为:
using Acme.BookStore.Books;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Volo.Abp.EntityFrameworkCore.Modeling;
namespace Acme.BookStore.EntityFrameworkCore
{
public static class BookStoreDbContextModelCreatingExtensions
{
public static void ConfigureBookStore(this ModelBuilder builder)
{
Check.NotNull(builder, nameof(builder));
/* Configure your own tables/entities inside here */
builder.Entity(b =>
{
b.ToTable(BookStoreConsts.DbTablePrefix + "Books",
BookStoreConsts.DbSchema);
b.ConfigureByConvention(); //auto configure for the base class props
b.Property(x => x.Name).IsRequired().HasMaxLength(128);
});
}
}
}
-
BookStoreConsts
含有用于表的架构和表前缀的常量值。您不必使用它,但是建议您在单点中控制表前缀。 -
ConfigureByConvention()
方法优雅地配置/映射继承的属性。始终将其用于所有实体。
启动模板使用EF Core Code First Migrations来创建和维护数据库架构。在菜单工具> NuGet软件包管理器下,打开软件包管理器控制台(PMC)。
选择Acme.BookStore.EntityFrameworkCore.DbMigrations
作为默认项目并执行以下命令:
Add-Migration "Created_Book_Entity"
这将在Acme.BookStore.EntityFrameworkCore.DbMigrations
项目的Migrations
文件夹内创建一个新的迁移类。
在更新数据库之前,请阅读以下部分,以了解如何将一些初始数据插入到数据库中。
如果使用的不是Visual Studio,则可以使用此处文档中的dotnet-ef
工具。
在运行应用程序之前,最好在数据库中包含一些初始数据。本节介绍ABP框架的数据种子系统。如果您不想创建种子数据,则可以跳过本节,但是建议您遵循它来学习此有用的ABP Framework功能。
创建一个从*.Domain
项目中的IDataSeedContributor
派生的类,并复制以下代码:
using System;
using System.Threading.Tasks;
using Acme.BookStore.Books;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
namespace Acme.BookStore
{
public class BookStoreDataSeederContributor
: IDataSeedContributor, ITransientDependency
{
private readonly IRepository _bookRepository;
public BookStoreDataSeederContributor(IRepository bookRepository)
{
_bookRepository = bookRepository;
}
public async Task SeedAsync(DataSeedContext context)
{
if (await _bookRepository.GetCountAsync()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?