基于 abp vNext 和 .NET Core 开发博客项目 - 数据访问和代码优先
1|0系列文章
- 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目
- 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来
- 基于 abp vNext 和 .NET Core 开发博客项目 - 完善与美化,Swagger登场
- 基于 abp vNext 和 .NET Core 开发博客项目 - 数据访问和代码优先
- 基于 abp vNext 和 .NET Core 开发博客项目 - 自定义仓储之增删改查
- 基于 abp vNext 和 .NET Core 开发博客项目 - 统一规范API,包装返回模型
- 基于 abp vNext 和 .NET Core 开发博客项目 - 再说Swagger,分组、描述、小绿锁
- 基于 abp vNext 和 .NET Core 开发博客项目 - 接入GitHub,用JWT保护你的API
- 基于 abp vNext 和 .NET Core 开发博客项目 - 异常处理和日志记录
- 基于 abp vNext 和 .NET Core 开发博客项目 - 使用Redis缓存数据
- 基于 abp vNext 和 .NET Core 开发博客项目 - 集成Hangfire实现定时任务处理
- 基于 abp vNext 和 .NET Core 开发博客项目 - 用AutoMapper搞定对象映射
- 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(一)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(二)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(三)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(一)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(二)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(三)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(五)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(一)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(二)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(四)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(五)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(六)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(七)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(八)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 终结篇之发布项目
上一篇文章(https://www.cnblogs.com/meowv/p/12909558.html)完善了项目中的代码,接入了Swagger。本篇主要使用Entity Framework Core完成对数据库的访问,以及使用Code-First的方式进行数据迁移,自动创建表结构。
2|0数据访问
在.EntityFrameworkCore
项目中添加我们的数据访问上下文对象MeowvBlogDbContext
,继承自 AbpDbContext<T>
。然后重写OnModelCreating
方法。
OnModelCreating
:定义EF Core 实体映射。先调用 base.OnModelCreating
让 abp 框架为我们实现基础映射,然后调用builder.Configure()
扩展方法来配置应用程序的实体。当然也可以不用扩展,直接写在里面,这样一大坨显得不好看而已。
在abp框架中,可以使用 [ConnectionStringName]
Attribute 为我们的DbContext配置连接字符串名称。先加上,然后再在appsettings.json
中进行配置,因为之前集成了多个数据库,所以这里我们也配置多个连接字符串,与之对应。
本项目默认采用MySql,你可以选择任意你喜欢的。
然后新建我们的扩展类MeowvBlogDbContextModelCreatingExtensions.cs
和扩展方法Configure()
。注意,扩展方法是静态的,需加static
完成上述操作后在我们的模块类MeowvBlogFrameworkCoreModule
中将DbContext注册到依赖注入,根据你配置的值使用不同的数据库。在.Domain
层创建配置文件访问类AppSettings.cs
获取配置文件内容比较容易,代码中有注释也很容易理解。
值得一提的是,ABP会自动为DbContext中的实体创建默认仓储. 需要在注册的时使用options添加AddDefaultRepositories()
。
默认情况下为每个实体创建一个仓储,如果想要为其他实体也创建仓储,可以将 includeAllEntities
设置为 true,然后就可以在服务中注入和使用 IRepository<TEntity>
或 IQueryableRepository<TEntity>
现在可以来初步设计博客所需表为:发表文章表(posts)、分类表(categories)、标签表(tags)、文章对应标签表(post_tags)、友情链接表(friendlinks)
在.Domain
层编写实体类,Post.cs、Category.cs、Tag.cs、PostTag.cs、FriendLink.cs。把主键设置为int型,直接继承Entity
点击查看代码
创建好实体类后,在MeowvBlogDbContext
添加DbSet属性
在.Domain.Shared
层添加全局常量类MeowvBlogConsts.cs
和表名常量类MeowvBlogDbConsts.cs
,搞一个表前缀的常量,我这里写的是meowv_
,大家可以随意。代表我们的表名都将以meowv_
开头。然后在MeowvBlogDbConsts
中将表名称定义好。
在Configure()
方法中配置表模型,包括表名、字段类型和长度等信息。对于下面代码不是很明白的可以看看微软的自定义 Code First 约定:https://docs.microsoft.com/zh-cn/ef/ef6/modeling/code-first/conventions/custom
此时项目层级目录如下
3|0代码优先
在.EntityFrameworkCore.DbMigrations
中新建模块类MeowvBlogEntityFrameworkCoreDbMigrationsModule.cs
、数据迁移上下文访问对象MeowvBlogMigrationsDbContext.cs
和一个Design Time Db Factory类MeowvBlogMigrationsDbContextFactory.cs
模块类依赖MeowvBlogFrameworkCoreModule
模块和AbpModule
。并在ConfigureServices
方法中添加上下文的依赖注入。
MeowvBlogMigrationsDbContext
和MeowvBlogDbContext
没什么大的区别
MeowvBlogMigrationsDbContextFactory
类主要是用来使用Code-First命令的(Add-Migration
和 Update-Database
...)
需要注意的地方,我们在这里要单独设置配置文件的连接字符串,将.HttpApi.Hosting
层的appsettings.json
复制一份到.EntityFrameworkCore.DbMigrations
,你用了什么数据库就配置什么数据库的连接字符串。
到这里差不多就结束了,默认数据库meowv_blog_tutorial
是不存在的,先去创建一个空的数据库。
然后在Visual Studio中打开程序包管理控制台,将.EntityFrameworkCore.DbMigrations
设为启动项目。
键入命令:Add-Migration Initial
,会发现报错啦,错误信息如下:
这是因为我们少添加了一个包,要使用代码优先方式迁移数据,必须添加,Microsoft.EntityFrameworkCore.Tools
。
紧接着直接用命令安装Install-Package Microsoft.EntityFrameworkCore.Tools
包,再试一遍
可以看到已经成功,并且生成了一个Migrations文件夹和对应的数据迁移文件
最后输入更新命令:Update-Database
,然后打开数据瞅瞅。
完美,成功创建了数据库表,而且命名也是我们想要的,字段类型也是ok的。__efmigrationshistory
表是用来记录迁移历史的,这个可以不用管。当我们后续如果想要修改添加表字段,新增表的时候,都可以使用这种方式来完成。
解决方案层级目录图,供参考
本篇使用Entity Framework Core完成数据访问和代码优先的方式创建数据库表,你学会了吗?😁😁😁
开源地址:https://github.com/Meowv/Blog/tree/blog_tutorial
__EOF__

本文链接:https://www.cnblogs.com/meowv/p/12913676.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?