Web应用程序开发教程 - 第七章: 数据库集成

关于本教程

在本系列教程中, 你将构建一个名为 Acme.BookStore 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以下技术开发的:

  • Entity Framework Core 做为ORM提供程序.
  • MVC / Razor Pages 做为UI框架.

本教程分为以下部分:

下载源码

本教程根据你的UI数据库偏好有多个版本,我们准备了几种可供下载的源码组合:

如果你在Windows中遇到 “文件名太长” or “解压错误”, 很可能与Windows最大文件路径限制有关. Windows文件路径的最大长度为250字符. 为了解决这个问题,参阅 在Windows 10中启用长路径.

如果你遇到与Git相关的长路径错误, 尝试使用下面的命令在Windows中启用长路径. 参阅 https://github.com/msysgit/msysgit/wiki/Git-cannot-create-a-file-or-directory-with-a-long-path git config --system core.longpaths true

简介

这章阐述如何为前一章介绍的 作者 实体配置数据库集成.

DB Context

打开 Acme.BookStore.EntityFrameworkCore 项目中的 BookStoreDbContext 加入 DbSet 属性:

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

定位到相同项目中的 BookStoreDbContext 类中的 OnModelCreating 方法, 加入以下代码到方法的结尾:

  1. builder.Entity<Author>(b =>
  2. {
  3. b.ToTable(BookStoreConsts.DbTablePrefix + "Authors",
  4. BookStoreConsts.DbSchema);
  5. b.ConfigureByConvention();
  6. b.Property(x => x.Name)
  7. .IsRequired()
  8. .HasMaxLength(AuthorConsts.MaxNameLength);
  9. b.HasIndex(x => x.Name);
  10. });

这和前面的 Book 实体做的一样, 所以不再赘述.

创建数据库迁移

配置启动解决方案为使用 Entity Framework Core Code First Migrations. 因为我们还没有修改数据库映射配置,所以需要创建一个新的迁移并对数据库应用变更.

打开命令行终端, 切换当前目录为 Acme.BookStore.EntityFrameworkCore 项目目录, 输入以下命令:

  1. dotnet ef migrations add Added_Authors

这会在项目中添加一个迁移类:

bookstore-efcore-migration-authors

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

  1. dotnet ef database update

如果你使用 Visual Studio, 可能希望在 Package Manager Console (PMC) 使用 Add-Migration Added_Authors -c BookStoreDbContextUpdate-Database -Context BookStoreDbContext 命令. 如果这样, 保证 Acme.BookStore.Web 是启动项目并且在PMC中 Acme.BookStore.EntityFrameworkCore默认项目 .

实现 IAuthorRepository

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Dynamic.Core;
  5. using System.Threading.Tasks;
  6. using Acme.BookStore.EntityFrameworkCore;
  7. using Microsoft.EntityFrameworkCore;
  8. using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
  9. using Volo.Abp.EntityFrameworkCore;
  10. namespace Acme.BookStore.Authors
  11. {
  12. public class EfCoreAuthorRepository
  13. : EfCoreRepository<BookStoreDbContext, Author, Guid>,
  14. IAuthorRepository
  15. {
  16. public EfCoreAuthorRepository(
  17. IDbContextProvider<BookStoreDbContext> dbContextProvider)
  18. : base(dbContextProvider)
  19. {
  20. }
  21. public async Task<Author> FindByNameAsync(string name)
  22. {
  23. var dbSet = await GetDbSetAsync();
  24. return await dbSet.FirstOrDefaultAsync(author => author.Name == name);
  25. }
  26. public async Task<List<Author>> GetListAsync(
  27. int skipCount,
  28. int maxResultCount,
  29. string sorting,
  30. string filter = null)
  31. {
  32. var dbSet = await GetDbSetAsync();
  33. return await dbSet
  34. .WhereIf(
  35. !filter.IsNullOrWhiteSpace(),
  36. author => author.Name.Contains(filter)
  37. )
  38. .OrderBy(sorting)
  39. .Skip(skipCount)
  40. .Take(maxResultCount)
  41. .ToListAsync();
  42. }
  43. }
  44. }
  • 继承自 EfCoreRepository, 所以继承了标准repository的方法实现.
  • WhereIf 是ABP 框架的快捷扩展方法. 它仅当第一个条件满足时, 执行 Where 查询. (根据名字查询, 仅当 filter 不为空). 你可以不使用这个方法, 但这些快捷方法可以提高效率.
  • sorting 可以是一个字符串, 如 Name, Name ASCName DESC. 通过使用 System.Linq.Dynamic.Core NuGet 包是可能的.

参阅 EF Core 集成文档 获得基于EF Core的repositories的更多信息.

下一章

查看本教程的下一章.