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也能维护表架构?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云服务器自己搭建安全么
- 下一篇: STM32CubeMX教程4 EXTI