Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构?
2024/1/3 14:03:09
本文主要是介绍Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构?
我们这里指的并不是查询,而是利用Ef的迁移原理,生成可用的其它表架构操作的Sql
。
例如你想在Ef Core
里建表,并且可能程序里有多个provider
,那么写Sql将是一件痛苦的事情,我们就是利用Ef Core
迁移时的操作,来为我们所用。
如果看过此系列中屏蔽外键的那一篇博客,我们的主角就暗藏在里面,它就是各种Operation
。
Operation
Ef Core
中所有的迁移的工作单元均由Operation
组成,例如CreateTableOperation
、AlterColumnOperation
等等,我们要做的就是将我们的操作组装为对应的Operation
来模拟迁移的操作,让Ef Core
去生成Sql
,那我们在一定程度上就避免了Sql
的强耦合,生成Sql
将有Ef Core
的提供程序来提供支持。
当然我们之前提到过,不同的提供程序可能有些实现是没有的,例如微软官方就不提供AlterColumnOperation
,直接采用的暴力的Drop
和Add
,我们只需重写IMigrationsSqlGenerator
中对应的实现即可。
使用Operation
有两种方法实现:
- 直接拼接Operation
- 类似于迁移文件的写法
直接拼接Operation
直接拼接Operation
需要我们创建对应的Operation
并且填充里面的主要信息,生成Sql
时,需要拿到DbContext
内部的IMigrationsSqlGenerator
作为服务,用于生成Sql
。
var service = CreateDbContext<DataDbContext>().GetService<IMigrationsSqlGenerator>(); var creator = new CreateTableOperation() { Name = "test", }; creator.Columns.Add(new AddColumnOperation() { Name = "Id", ClrType = typeof(int), IsNullable = false }); var operations = new List<MigrationOperation> { creator }; var cmd = service.Generate(operations); foreach (var item in cmd.Select(x => x.CommandText)) { TestOutputHelper.WriteLine(item); }
类似于迁移文件的写法
类似于迁移文件的写法实现时,和迁移文件中展现的部分基本一样,生成Sql
时,需要构建一个MigrationBuilder
并且提供你要使用的Ef Core
提供程序,项目里需要引用该提供程序。随后即可生成对应的Sql
。
MigrationBuilder t = new MigrationBuilder("Microsoft.EntityFrameworkCore.SqlServer"); t.CreateTable( name: "flow_draft", columns: table => new { ID = table.Column<string>(type: "varchar(36)", maxLength: 36, nullable: false), FlowId = table.Column<string>(type: "varchar(50)", maxLength: 50, nullable: false, comment: "流程Id"), UserId = table.Column<string>(type: "varchar(255)", nullable: false, comment: "草稿提交人"), FormDataId = table.Column<string>(type: "varchar(36)", maxLength: 36, nullable: false, comment: "数据Id"), Content = table.Column<string>(type: "longtext", nullable: false, comment: "表单冗余数据") }, constraints: table => { table.PrimaryKey("PK_flow_draft", x => x.ID); }, comment: "流程草稿记录") .Annotation("MySQL:Charset", "utf8mb4"); cmd = service.Generate(t.Operations); foreach (var item in cmd.Select(x => x.CommandText)) { TestOutputHelper.WriteLine(item); }
这篇关于Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享
- 2024-11-22ansible 的archive 参数是什么意思?-icode9专业技术文章分享
- 2024-11-22ansible 中怎么只用archive 排除某个目录?-icode9专业技术文章分享
- 2024-11-22exclude_path参数是什么作用?-icode9专业技术文章分享
- 2024-11-22微信开放平台第三方平台什么时候调用数据预拉取和数据周期性更新接口?-icode9专业技术文章分享
- 2024-11-22uniapp 实现聊天消息会话的列表功能怎么实现?-icode9专业技术文章分享
- 2024-11-22在Mac系统上将图片中的文字提取出来有哪些方法?-icode9专业技术文章分享
- 2024-11-22excel 表格中怎么固定一行显示不滚动?-icode9专业技术文章分享
- 2024-11-22怎么将 -rwxr-xr-x 修改为 drwxr-xr-x?-icode9专业技术文章分享
- 2024-11-22在Excel中怎么将小数向上取整到最接近的整数?-icode9专业技术文章分享