制作动态流程图和架构图

微软 Visio 工具 Visio 是微软的画图工具,非常强大,但是收费,而且只能在 Windows 系统上使用,不支持 Mac 和 Linux 系统,虽然微软推出了 Visio Online,但是功能还是比较弱,而且收费。 开源 Drawio 工具 Drawio 是一个开源的画图工具,支持在线和桌面两种方式,支持多种格式,支持多种平台,支持多种语言,支持多种图形,支持多种导出格式,支持多种插件,支持多种集成方式,也支持在 Visual Studio Code 中使用插件的方式画图。 矢量图和位图 矢量图是由数学公式描述的图形,可以无限放大,不会失真,位图是由像素点描述的图形,放大会失真。 画图入口 Drawio 官网 在线画图 容器和容器大小缩放 设置图形 Container 属性为 true,可以将多个图形组合成一个图形,然后可以对这个图形进行缩放,设置 Collapsed 属性为 true,可以将图形折叠起来,只显示标题。设置 Resizable 属性为 false,可以禁止容器子图形缩放。 浮动链接和固定链接 浮动链接是指链接的位置随着图形的移动而移动,固定链接是指链接的位置不随着图形的移动而移动,可以添加自定义连接点。 拖动连接线文字 设置连接线文字可以拖动,可以将连接线文字拖动到连接线的任意位置,可以自定难以连接点的位置。 连接线的样式和反转 可以设置连接线的样式,可以设置连接线的反转,可以设置连接线的弯曲程度。 图形和连接线文字位置 设置文字位置,可以将文字放在图形或连接线左上角,设置文字位置为中心,可以将文字放在图形的中心。 连接线添加航点 可以在连接线上添加航点,可以在连接线上添加箭头,可以在连接线上添加标签。 任何目标可设置链接 可以设置任何对象的超级链接,可以设置连接线的超级链接,可以设置图形的超级链接。 替换图形 可以将新图形拖动到现有图形上替换图形,替换后,图形的属性和连接线都会保留。 对齐方式和分布方式 可以设置图形的对齐方式,可以设置图形的分布方式。 带着样式画图 可以带着样式画图,可以将样式应用到图形上,也可以清除默认样式。 嵌入图像和在线图像 理解几何图形,图形库图形,嵌入图像,在线图像的区别。 嵌入 SVG 图像修改样式 使用阿里图标库 iconfont 找图,可以下载 SVG 图像,然后嵌入到 Drawio 中,可以修改 SVG 图像的样式,但需要配置规则,如下代码。 ...

2026年3月10日

自动迁移和数据库初始化

生成迁移脚本 dotnet ef migrations add InitialCreate --output-dir Infrastructure/Migrations 手动将最新迁移脚本应用到数据库 dotnet ef database update 使用代码创建数据库 await dbContext.Database.EnsureCreatedAsync(); EnsureCreatedAsync 会创建数据库(如果不存在),并会创建所有表,但不会应用迁移脚本,适用于开发环境。 使用代码将最新迁移脚本应用到数据库 await dbContext.Database.MigrateAsync(); MigrateAsync 会应用迁移脚本,如果数据库不存在,会先创建数据库,适用于生产环境。 注意事项 如果先前已经使用 EnsureCreatedAsync 创建了数据库,再使用 MigrateAsync 会抛出异常,因为数据库和所有表已经存在,因为迁移中有创建表的操作脚本。 如果数据库不存在,使用 MigrateAsync 会先创建数据库,再创建迁移历史表,然后再应用迁移脚本,但这个过程中会打印一些错误警告信息,虽然可以忽略,但不够优雅。 优雅的做法 这里使用到一些 EF Core 的内部服务,注意他们在实现细节上的区别。 private static async ValueTask RunMigrationAsync(TDbContext dbContext, CancellationToken cancellationToken) { var strategy = dbContext.Database.CreateExecutionStrategy(); var dbCreator = dbContext.GetService<IRelationalDatabaseCreator>(); var historyRepository = dbContext.GetService<IHistoryRepository>(); await strategy.ExecuteAsync(async () => { if (!await dbCreator.ExistsAsync(cancellationToken)) { await dbCreator.CreateAsync(cancellationToken); } await historyRepository.CreateIfNotExistsAsync(); await dbContext.Database.MigrateAsync(cancellationToken); }); } 1、使用 dbCreator.ExistsAsync 先检查数据库是否存在,不存在则仅仅创建数据库(它不会创建表),这个时候得到一个空的数据库。 2、再使用 historyRepository.CreateIfNotExistsAsync 在空数据库中创建迁移历史表,用于保存迁移记录。 3、最后使用 dbContext.Database.MigrateAsync 应用迁移脚本,因为迁移脚本中的操作会在空数据库中执行,包括创建表等等操作。 4、迁移完成后,数据库中会有所有表和迁移历史表,迁移历史表中登记了最新的迁移记录。 5、后续再使用 dbContext.Database.MigrateAsync 会检查迁移历史表,如果有新的迁移脚本,会应用新的迁移脚本。 6、这样就实现了自动迁移和数据库初始化。 为了以上操作都在一个事务中执行,我们使用 dbContext.Database.CreateExecutionStrategy 创建一个执行策略, 在策略中执行上述操作。 数据库初始化的方式 在最新的 EF 9.0 建议使用 UseSeeding 和 UseAsyncSeeding 并利用初始数据对数据库进行种子设定,这些代码会在迁移时执行。 ...

2026年3月10日

自动映射实体和模型

使用 AutoMapper 自动映射实体和模型 AutoMapper 是一个对象映射工具,可以自动映射实体对象和模型对象,减少手动映射的工作量,提高开发效率,除此之外 Mapster 也是一个高性能的对象映射工具,支持源生成代码,性能更好。AutoMapper 比 Mapster 更加流行,更加成熟,更加稳定,更加易用,更加灵活,更加强大,更加全面,更加受欢迎。AutoMapper 是 .NET Foundation 的一部分,是一个开源项目,是一个非常优秀的对象映射工具。 安装 NuGet 包 dotnet add package AutoMapper 在依赖注入中注册 AutoMapper builder.Services.AddAutoMapper(Assembly.GetExecutingAssembly()); 创建映射配置文件 public class MappingProfile : Profile { public MappingProfile() { CreateMap<User, UserDto>(); CreateMap<UserDto, User>(); } } 使用 AutoMapper 映射实体和模型 public class UserService { private readonly IMapper _mapper; public UserService(IMapper mapper) { _mapper = mapper; } public UserDto GetUser(int id) { var user = _dbContext.Users.Find(id); return _mapper.Map<UserDto>(user); } public void UpdateUser(UserDto userDto) { var user = _mapper.Map<User>(userDto); _dbContext.Users.Update(user); _dbContext.SaveChanges(); } } 分页模式 常见的分页模式有两种,一种是基于页码和页大小的分页模式,一种是基于游标和页大小的分页模式。

2026年3月10日

我的第一篇笔记

这是粗体文字,这是斜体文字。 访问 Hugo 官网!

2026年3月10日