项目

本文档有多个版本。请选择最适合您的选项。

UI
Database

Web 应用开发教程 - 第 7 部分:作者:数据库集成

简介

本部分介绍如何为上一部分引入的 Author 实体配置数据库集成。

DB 上下文

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

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

然后在同一项目的 BookStoreDbContext 类中找到 OnModelCreating 方法,并在方法末尾添加以下代码:

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);
});

这与之前为 Book 实体所做的操作类似,因此不再赘述。

创建新的数据库迁移

启动解决方案已配置为使用 Entity Framework Core Code First 迁移。由于我们更改了数据库映射配置,应创建新的迁移并将更改应用到数据库。

Acme.BookStore.EntityFrameworkCore 项目目录中打开命令行终端,并输入以下命令:

dotnet ef migrations add Added_Authors

这将在项目中添加一个新的迁移类:

bookstore-efcore-migration-authors

你可以在同一命令行终端中使用以下命令将更改应用到数据库:

dotnet ef database update

如果使用 Visual Studio,你可能希望在 程序包管理器控制台 (PMC) 中使用 Add-Migration Added_AuthorsUpdate-Database 命令。在这种情况下,请确保在 Visual Studio 中将 Acme.BookStore.EntityFrameworkCore 设为启动项目,并在 PMC 中将 Acme.BookStore.EntityFrameworkCore 设为 默认项目

实现 IAuthorRepository 接口

Acme.BookStore.EntityFrameworkCore 项目(Authors 文件夹内)中创建一个新类,命名为 EfCoreAuthorRepository,并粘贴以下代码:

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
{
    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();
    }
}
  • 继承自 EfCoreRepository,因此继承了标准仓储方法的实现。
  • WhereIf 是 ABP 的一个快捷扩展方法。仅当满足第一个条件时(仅当提供了过滤器时按名称过滤),它才添加 Where 条件。你也可以自己实现,但这类快捷方法能让我们的工作更轻松。
  • sorting 可以是像 NameName ASCName DESC 这样的字符串。这是通过使用 System.Linq.Dynamic.Core NuGet 包实现的。

有关基于 EF Core 的仓储的更多信息,请参阅 EF Core 集成文档


在本文档中