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
这将在项目中添加一个新的迁移类:
你可以在同一命令行终端中使用以下命令将更改应用到数据库:
dotnet ef database update
如果使用 Visual Studio,你可能希望在 程序包管理器控制台 (PMC) 中使用
Add-Migration Added_Authors和Update-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可以是像Name、Name ASC或Name DESC这样的字符串。这是通过使用 System.Linq.Dynamic.Core NuGet 包实现的。
有关基于 EF Core 的仓储的更多信息,请参阅 EF Core 集成文档。
抠丁客



