Web应用开发教程 - Part 7: 作家:数据库集成
Web应用开发教程 - Part 7: 作家:数据库集成
//[doc-params]
{
"UI": ["MVC","Blazor","BlazorServer","NG"],
"DB": ["EF","Mongo"]
}
关于本教程
在这个教程系列中,你将创建一个基于ABP的Web应用程序,叫 Acme.BookStore
。这个应用程序是用来管理书籍及其作家的列表的。它是使用以下技术开发:
- {{DB_Value}} 作为ORM的提供者。
- {{UI_Value}} 作为UI框架。
本教程由以下几个部分组成:
- 第一部分:创建服务器端
- 第2部分:书籍列表页
- 第3部分:创建、更新和删除书籍
- 第四部分:集成测试
- 第5部分:授权
- 第六部分:作家:领域层
- 第七部分:作家:数据库集成(本部分)
- 第8部分:作家:应用层
- 第九部分:作家:用户界面
- 第10部分:关联书籍与作家
下载源代码
本教程根据你对UI和Database的偏好有多个版本。我们准备了几个组合的源代码供大家下载:
如果你在Windows上遇到 "文件名太长 "或 "解压错误",它可能与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
简介
This part explains how to configure the database integration for the Author
entity introduced in the previous part.
这一部分解释了如何为上一部分介绍的Author
实体配置数据库集成。
{{if DB=="EF"}}
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
这将为项目添加一个新的迁移类:
你可以在同一个命令行终端中使用以下命令对数据库进行修改:
dotnet ef database update
如果你使用Visual Studio,你可能需要在包管理器控制台(PMC)中使用
Add-Migration Added_Authors -c BookStoreMigrationsDbContext
和Update-Database -c BookStoreMigrationsDbContext
命令。在这种情况下,确保{{if UI"MVC"}}Acme.BookStore.Web
{{else if UI"BlazorServer"}}Acme.BookStore.Blazor
{{else if UI"Blazor" || UI"NG"}}Acme. BookStore.HttpApi.Host
{{end}}是启动项目,Acme.BookStore.EntityFrameworkCore
是PMC中的默认项目。
{{else if DB=="Mongo"}}
DB Context
打开Acme.BookStore.MongoDb
项目的MongoDb
文件夹中的BookStoreMongoDbContext
,向该类添加以下属性:
public IMongoCollection<Author> Authors => Collection<Author>();
{{end}}
实现IAuthorRepository
{{if DB=="EF"}}
在Acme.BookStore.EntityFrameworkCore
项目中(在Authors
文件夹中)创建一个新的类命名为EfCoreAuthorository
,并粘贴以下代码:
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集成文档。
{{else if DB=="Mongo"}}
在Acme.BookStore.MongoDB
项目中(在Authors
文件夹中)创建一个新的类,命名为MongoDbAuthorository
,并粘贴以下代码:
using System;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Collections.Generic;
using System.Threading.Tasks;
using Acme.BookStore.MongoDB;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using Volo.Abp.Domain.Repositories.MongoDB;
using Volo.Abp.MongoDB;
namespace Acme.BookStore.Authors
{
public class MongoDbAuthorRepository
: MongoDbRepository<BookStoreMongoDbContext, Author, Guid>,
IAuthorRepository
{
public MongoDbAuthorRepository(
IMongoDbContextProvider<BookStoreMongoDbContext> dbContextProvider
) : base(dbContextProvider)
{
}
public async Task<Author> FindByNameAsync(string name)
{
var queryable = await GetMongoQueryableAsync();
return await queryable.FirstOrDefaultAsync(author => author.Name == name);
}
public async Task<List<Author>> GetListAsync(
int skipCount,
int maxResultCount,
string sorting,
string filter = null)
{
var queryable = await GetMongoQueryableAsync();
return await queryable
.WhereIf<Author, IMongoQueryable<Author>>(
!filter.IsNullOrWhiteSpace(),
author => author.Name.Contains(filter)
)
.OrderBy(sorting)
.As<IMongoQueryable<Author>>()
.Skip(skipCount)
.Take(maxResultCount)
.ToListAsync();
}
}
}
- 继承自
MongoDbRepository
,因此它继承了标准的存储库方法实现。 WhereIf
是ABP框架的一个快捷的扩展方法。它只在第一个条件满足的情况下添加Where
条件(它通过名称过滤,只在提供过滤器的情况下)。你可以自己做同样的事情,但是这些类型的快捷方法使我们的生活更容易。sorting
可以是一个字符串,如Name
,Name ASC
或Name DESC
。通过使用System.Linq.Dynamic.Core NuGet包可以实现。
参考MongoDB集成文档以了解更多关于基于MongoDB的存储库的信息。
{{end}}
下一篇
见本教程的下一篇。
本文来自博客园,作者:草叶睡蜢,转载请注明原文链接:https://www.cnblogs.com/tjubuntu/p/15718040.html