ABP.IO WEB應用程式框架 新手教學 No.08 開發教學 第 7 部分:作者:數據庫集成

主要說明如何實現自定義倉儲

其他之前已說明過的部分則快速帶過

關於本教程

在本系列教程中,您將構建一個名為Acme.BookStore. 此應用程序用於管理書籍及其作者的列表。它是使用以下技術開發的:

  • Entity Framework Core作為 ORM 提供者。
  • Angular作為 UI 框架。

本教程分為以下幾個部分;

下載源代碼

本教程根據您的UI數據庫首選項有多個版本。我們準備了幾個要下載的源代碼組合:

介紹

這一部分解釋瞭如何為上一部分介紹的Author實體配置數據庫集成。

數據庫上下文

BookStoreDbContextAcme.BookStore.EntityFrameworkCore項目中打開並添加以下DbSet屬性:

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

然後BookStoreDbContextModelCreatingExtensions在同一個項目中打開類,在ConfigureBookStore方法的末尾添加以下幾行:

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.DbMigrations項目目錄中打開命令行終端並鍵入以下命令:

dotnet ef migrations add Added_Authors

這將向項目添加一個新的遷移類:

bookstore-efcore-migration-authors

您可以在同一命令行終端中使用以下命令對數據庫應用更改:

dotnet ef database update

如果您使用的是 Visual Studio,您可能需要在包管理器控制台 (PMC) 中使用Add-Migration Added_Authors -c BookStoreMigrationsDbContextUpdate-Database -c BookStoreMigrationsDbContext命令。在這種情況下,請確保是啟動項目並且是PMC 中的默認項目Acme.BookStore.HttpApi.HostAcme.BookStore.EntityFrameworkCore.DbMigrations

實現 IAuthorRepository

創建一個新類,EfCoreAuthorRepositoryAcme.BookStore.EntityFrameworkCore項目內部(Authors文件夾中)命名並粘貼以下代碼:

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 集成文檔

下一部分

請參閱本教程的下一部分

PS5