[MAUI 项目实战] 笔记App(二):数据库设计
Sqlite配置
应用程序里使用Sqlite作为数据库,使用EntityFramworkCore作为ORM,使用CodeFirst方式用EFCore初始化Sqlite数据库文件:mato.db
在MatoProductivity.Core项目的appsettings.json
中添加本地sqlite连接字符串
1 | "ConnectionStrings": { |
这里文件是一个占位符,通过代码hardcode到配置文件
在MatoProductivityCoreModule.cs中,重写PreInitialize并设置Configuration.DefaultNameOrConnectionString:
1 | public override void PreInitialize() |
创建实体
接下来定义实体类
笔记实体类
笔记用于存储实体,在笔记列表中,每个笔记都有标题和内容,创建时间等内容。
定义于\MatoProductivity.Core\Models\Entities\Note.cs
1 |
|
笔记分组实体
定义于\MatoProductivity.Core\Models\Entities\NoteGroup.cs
1 | public class NoteGroup : FullAuditedEntity<long> |
笔记片段实体
定义于\MatoProductivity.Core\Models\Entities\NoteSegment.cs
1 | public class NoteSegment : FullAuditedEntity<long>, INoteSegment |
笔记片段负载实体
笔记片段负载与笔记片段实体为一对多的关系,用于存储笔记片段的详细内容。
定义于\MatoProductivity.Core\Models\Entities\NoteSegmentPayload.cs
1 | public class NoteSegmentPayload : FullAuditedEntity<long>, INoteSegmentPayload |
笔记片段仓库实体
用于在编辑笔记页面的添加片段菜单中,加载所有可用的片段
定义于\MatoProductivity.Core\Models\Entities\NoteSegmentStore.cs
1 | public class NoteSegmentStore : Entity<long> |
笔记模板(场景)实体
定义于\MatoProductivity.Core\Models\Entities\NoteTemplate.cs
1 | public class NoteTemplate : FullAuditedEntity<long> |
笔记片段模板实体
定义于\MatoProductivity.Core\Models\Entities\NoteSegmentTemplate.cs
1 | public class NoteSegmentTemplate : FullAuditedEntity<long>, INoteSegment |
笔记片段模板负载实体
定义于\MatoProductivity.Core\Models\Entities\NoteSegmentTemplatePayload.cs
1 | public class NoteSegmentTemplatePayload : FullAuditedEntity<long>, INoteSegmentPayload |
配置EF
数据库上下文对象MatoProductivityDbContext
定义如下
1 | public class MatoProductivityDbContext : AbpDbContext |
MatoProductivity.EntityFrameworkCore是应用程序数据库的维护和管理项目,依赖于Abp.EntityFrameworkCore。
在MatoProductivity.EntityFrameworkCore项目中csproj文件中,引用下列包
1 | <PackageReference Include="Abp.EntityFrameworkCore" Version="7.4.0" /> |
在该项目MatoProductivityEntityFrameworkCoreModule.cs 中,将注册上下文对象,并在程序初始化运行迁移,此时将在设备上生成mato.db
文件
1 | public override void PostInitialize() |
创建映射
从场景到笔记,或者说从模板到实例,我们需要映射,例如从笔记片段菜单中选择一个片段添加,那么需要从笔记片段仓库实体(NoteSegmentStore)映射到笔记片段实体(NoteSegment)或者,在编辑场景中,映射到笔记片段模板实体(NoteSegmentTemplate)。
1 | [AutoMapTo(typeof(NoteSegment), typeof(NoteSegmentTemplate))] |
使用时:
1 | var note = ObjectMapper.Map<NoteSegment>(noteSegmentStore); |
ABP框架默认使用AutoMapper
进行映射,所以需要配置映射关系。
1 | Configuration.Modules.AbpAutoMapper().Configurators.Add(config => |
迁移和种子数据
MatoProductivity.EntityFrameworkCore.Seed.SeedHelper
可在程序启动时,访问数据库,并初始化种子数据。
1 | public override void PostInitialize() |
它通过SkipDbSeed
来决定是否跳过执行种子数据初始化。我们需要在安装完成App后第一次运行才执行种子数据初始化。
MAUI中提供了VersionTracking.Default.IsFirstLaunchEver
方式获取是否是第一次在此设备上启动应用,请查看官方文档
1 | public override async void Initialize() |
在InitialDbBuilder中我们定义了大多数的业务初始数据,具体的实现方式请查阅源码。
1 | internal void Create() |
项目地址
[MAUI 项目实战] 笔记App(二):数据库设计