Abp vNext - 应用开发系列之数据访问

在系列教程中,我们会构建一个基于ABP的Web应用程序,用于管理书籍及其作者列表

使用到的技术:

  • Entity Framework Core
  • Angular

本教程分为以下部分:

DB Context

Acme.BookStore.EntityFrameworkCore 项目中打开“ BookStoreDbContext 并添加以下 DbSet 属性:

1
public DbSet<Author> Authors { get; set; }

并在OnModelCreating中添加以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
builder.Entity<Author>(b =>
{
b.ToTable(BookStoreConsts.DbTablePrefix + "Authors",
BookStoreConsts.DbSchema);

b.ConfigureByConvention();

b.Property(x => x.Name)
.IsRequired()
.HasMaxLength(AuthorConsts.MaxNameLength);

b.HasIndex(x => x.Name);
});

Migration

新增实体后需要创建新的迁移以同步更新到数据库中。

.EntityFramework.Core设为启动项目,打开命令行,输入以下命令新增迁移:

1
dotnet ef migrations add Added_Authors

new-migration

更新到数据库:

1
dotnet ef database update

如果使用的是 Visual Studio,则需要在包管理器控制台 (PMC) 中使用 Add-Migration Added_Authors and Update-Database 命令。在这种情况下,请确保 Acme.BookStore.EntityFrameworkCore 是 Visual Studio 中的启动项目,并且是 Acme.BookStore.EntityFrameworkCore PMC 中的默认项目。

实现IAuthorRepository

Acme.BookStore.EntityFrameworkCore 项目内( Authors 在文件夹中)创建 EfCoreAuthorRepository.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Threading.Tasks;
using Acme.BookStore.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;

namespace Acme.BookStore.Authors;

public class EfCoreAuthorRepository
: EfCoreRepository<BookStoreDbContext, Author, Guid>,
IAuthorRepository
{
/// <summary>
/// DI
/// </summary>
/// <param name="dbContextProvider"></param>
public EfCoreAuthorRepository(
IDbContextProvider<BookStoreDbContext> dbContextProvider)
: base(dbContextProvider)
{
}

public async Task<Author> FindByNameAsync(string name)
{
var dbSet = await GetDbSetAsync();
return await dbSet.FirstOrDefaultAsync(author => author.Name == name);
}

public async Task<List<Author>> GetListAsync(
int skipCount,
int maxResultCount,
string sorting,
string filter = null)
{
var dbSet = await GetDbSetAsync();
return await dbSet
.WhereIf(
!filter.IsNullOrWhiteSpace(),
author => author.Name.Contains(filter)
)
.OrderBy(sorting)
.Skip(skipCount)
.Take(maxResultCount)
.ToListAsync();
}
}
  • EfCoreAuthorRepository继承自EfCoreRepository
  • WhereIf 是ABP框架的扩展方法。当第一个条件满足时,才会添加 Where 条件
  • sorting 可以是类似 NameName ASCName DESC 的字符串。可以使用 System.Linq.Dynamic.Core NuGet 包。

下一节

教程下一节