版本
语言

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

UI
Database

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 属性:

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 Migrations. 因为我们还没有修改数据库映射配置,所以需要创建一个新的迁移并对数据库应用变更.

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

dotnet ef migrations add Added_Authors

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

bookstore-efcore-migration-authors

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

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, 粘贴以下代码:

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, 所以继承了标准repository的方法实现.
  • WhereIf 是ABP 框架的快捷扩展方法. 它仅当第一个条件满足时, 执行 Where 查询. (根据名字查询, 仅当 filter 不为空). 你可以不使用这个方法, 但这些快捷方法可以提高效率.
  • sorting 可以是一个字符串, 如 Name, Name ASCName DESC. 通过使用 System.Linq.Dynamic.Core NuGet 包是可能的.

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

下一章

查看本教程的下一章.

本页对您有帮助吗?
请进行选择。
感谢您的宝贵意见!

请注意,虽然我们无法回复反馈意见,但我们的团队会根据您的意见改进体验。

在本文档中
Mastering ABP Framework Book
掌握 ABP 框架

本书将帮助你全面了解框架和现代Web应用程序开发技术。