上一篇文章(https://www.cnblogs.com/meowv/p/12909558.html)完善了项目中的代码,接入了Swagger。本篇主要使用Entity Framework Core完成对数据库的访问,以及使用Code-First的方式进行数据迁移,自动创建表结构。
数据访问在.EntityFrameworkCore项目中添加我们的数据访问上下文对象MeowvBlogDbContext,继承自 AbpDbContext<T>。然后重写OnModelCreating方法。
OnModelCreating:定义EF Core 实体映射。先调用 base.OnModelCreating 让 abp 框架为我们实现基础映射,然后调用builder.Configure()扩展方法来配置应用程序的实体。当然也可以不用扩展,直接写在里面,这样一大坨显得不好看而已。
在abp框架中,可以使用 [ConnectionStringName] Attribute 为我们的DbContext配置连接字符串名称。先加上,然后再在appsettings.json中进行配置,因为之前集成了多个数据库,所以这里我们也配置多个连接字符串,与之对应。
本项目默认采用MySql,你可以选择任意你喜欢的。
//MeowvBlogDbContext.cs using Microsoft.EntityFrameworkCore; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; namespace Meowv.Blog.EntityFrameworkCore { [ConnectionStringName("MySql")] public class MeowvBlogDbContext : AbpDbContext<MeowvBlogDbContext> { public MeowvBlogDbContext(DbContextOptions<MeowvBlogDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Configure(); } } } //appsettings.json { "ConnectionStrings": { "Enable": "MySQL", "MySql": "Server=localhost;User Id=root;Password=123456;Database=meowv_blog_tutorial", "SqlServer": "", "PostgreSql": "", "Sqlite": "" } }然后新建我们的扩展类MeowvBlogDbContextModelCreatingExtensions.cs和扩展方法Configure()。注意,扩展方法是静态的,需加static
//MeowvBlogDbContextModelCreatingExtensions.cs using Microsoft.EntityFrameworkCore; using Volo.Abp; namespace Meowv.Blog.EntityFrameworkCore { public static class MeowvBlogDbContextModelCreatingExtensions { public static void Configure(this ModelBuilder builder) { Check.NotNull(builder, nameof(builder)); ... } } }完成上述操作后在我们的模块类MeowvBlogFrameworkCoreModule中将DbContext注册到依赖注入,根据你配置的值使用不同的数据库。在.Domain层创建配置文件访问类AppSettings.cs
//AppSettings.cs using Microsoft.Extensions.Configuration; using System.IO; namespace Meowv.Blog.Domain.Configurations { /// <summary> /// appsettings.json配置文件数据读取类 /// </summary> public class AppSettings { /// <summary> /// 配置文件的根节点 /// </summary> private static readonly IConfigurationRoot _config; /// <summary> /// Constructor /// </summary> static AppSettings() { // 加载appsettings.json,并构建IConfigurationRoot var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", true, true); _config = builder.Build(); } /// <summary> /// EnableDb /// </summary> public static string EnableDb => _config["ConnectionStrings:Enable"]; /// <summary> /// ConnectionStrings /// </summary> public static string ConnectionStrings => _config.GetConnectionString(EnableDb); } }获取配置文件内容比较容易,代码中有注释也很容易理解。
值得一提的是,ABP会自动为DbContext中的实体创建默认仓储. 需要在注册的时使用options添加AddDefaultRepositories()。
默认情况下为每个实体创建一个仓储,如果想要为其他实体也创建仓储,可以将 includeAllEntities 设置为 true,然后就可以在服务中注入和使用 IRepository<TEntity> 或 IQueryableRepository<TEntity>
//MeowvBlogFrameworkCoreModule.cs using Meowv.Blog.Domain; using Meowv.Blog.Domain.Configurations; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.MySQL; using Volo.Abp.EntityFrameworkCore.PostgreSql; using Volo.Abp.EntityFrameworkCore.Sqlite; using Volo.Abp.EntityFrameworkCore.SqlServer; using Volo.Abp.Modularity; namespace Meowv.Blog.EntityFrameworkCore { [DependsOn( typeof(MeowvBlogDomainModule), typeof(AbpEntityFrameworkCoreModule), typeof(AbpEntityFrameworkCoreMySQLModule), typeof(AbpEntityFrameworkCoreSqlServerModule), typeof(AbpEntityFrameworkCorePostgreSqlModule), typeof(AbpEntityFrameworkCoreSqliteModule) )] public class MeowvBlogFrameworkCoreModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddAbpDbContext<MeowvBlogDbContext>(options => { options.AddDefaultRepositories(includeAllEntities: true); }); Configure<AbpDbContextOptions>(options => { switch (AppSettings.EnableDb) { case "MySQL": options.UseMySQL(); break; case "SqlServer": options.UseSqlServer(); break; case "PostgreSql": options.UsePostgreSql(); break; case "Sqlite": options.UseSqlite(); break; default: options.UseMySQL(); break; } }); } } }现在可以来初步设计博客所需表为:发表文章表(posts)、分类表(categories)、标签表(tags)、文章对应标签表(post_tags)、友情链接表(friendlinks)