经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构?
来源:cnblogs  作者:胖纸不争  时间:2024/1/3 9:13:44  对本文有异议

Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构?

我们这里指的并不是查询,而是利用Ef的迁移原理,生成可用的其它表架构操作的Sql

例如你想在Ef Core里建表,并且可能程序里有多个provider,那么写Sql将是一件痛苦的事情,我们就是利用Ef Core迁移时的操作,来为我们所用。

如果看过此系列中屏蔽外键的那一篇博客,我们的主角就暗藏在里面,它就是各种Operation

Operation

Ef Core中所有的迁移的工作单元均由Operation组成,例如CreateTableOperationAlterColumnOperation等等,我们要做的就是将我们的操作组装为对应的Operation来模拟迁移的操作,让Ef Core去生成Sql,那我们在一定程度上就避免了Sql的强耦合,生成Sql将有Ef Core的提供程序来提供支持。

当然我们之前提到过,不同的提供程序可能有些实现是没有的,例如微软官方就不提供AlterColumnOperation,直接采用的暴力的DropAdd,我们只需重写IMigrationsSqlGenerator中对应的实现即可。

使用Operation有两种方法实现:

  • 直接拼接Operation
  • 类似于迁移文件的写法

直接拼接Operation

直接拼接Operation需要我们创建对应的Operation并且填充里面的主要信息,生成Sql时,需要拿到DbContext内部的IMigrationsSqlGenerator作为服务,用于生成Sql

  1. var service = CreateDbContext<DataDbContext>().GetService<IMigrationsSqlGenerator>();
  2. var creator = new CreateTableOperation()
  3. {
  4. Name = "test",
  5. };
  6. creator.Columns.Add(new AddColumnOperation()
  7. {
  8. Name = "Id",
  9. ClrType = typeof(int),
  10. IsNullable = false
  11. });
  12. var operations = new List<MigrationOperation> {
  13. creator
  14. };
  15. var cmd = service.Generate(operations);
  16. foreach (var item in cmd.Select(x => x.CommandText))
  17. {
  18. TestOutputHelper.WriteLine(item);
  19. }

类似于迁移文件的写法

类似于迁移文件的写法实现时,和迁移文件中展现的部分基本一样,生成Sql时,需要构建一个MigrationBuilder并且提供你要使用的Ef Core提供程序,项目里需要引用该提供程序。随后即可生成对应的Sql

  1. MigrationBuilder t = new MigrationBuilder("Microsoft.EntityFrameworkCore.SqlServer");
  2. t.CreateTable(
  3. name: "flow_draft",
  4. columns: table => new
  5. {
  6. ID = table.Column<string>(type: "varchar(36)", maxLength: 36, nullable: false),
  7. FlowId = table.Column<string>(type: "varchar(50)", maxLength: 50, nullable: false, comment: "流程Id"),
  8. UserId = table.Column<string>(type: "varchar(255)", nullable: false, comment: "草稿提交人"),
  9. FormDataId = table.Column<string>(type: "varchar(36)", maxLength: 36, nullable: false, comment: "数据Id"),
  10. Content = table.Column<string>(type: "longtext", nullable: false, comment: "表单冗余数据")
  11. },
  12. constraints: table =>
  13. {
  14. table.PrimaryKey("PK_flow_draft", x => x.ID);
  15. },
  16. comment: "流程草稿记录")
  17. .Annotation("MySQL:Charset", "utf8mb4");
  18. cmd = service.Generate(t.Operations);
  19. foreach (var item in cmd.Select(x => x.CommandText))
  20. {
  21. TestOutputHelper.WriteLine(item);
  22. }

原文链接:https://www.cnblogs.com/donpangpang/p/17942407

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号