日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

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

發(fā)布時(shí)間:2024/1/3 windows 37 coder
生活随笔 收集整理的這篇文章主要介紹了 Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Ef Core花里胡哨系列(7) 使用Ef Core也能維護(hù)表架構(gòu)?

我們這里指的并不是查詢,而是利用Ef的遷移原理,生成可用的其它表架構(gòu)操作的Sql。

例如你想在Ef Core里建表,并且可能程序里有多個(gè)provider,那么寫Sql將是一件痛苦的事情,我們就是利用Ef Core遷移時(shí)的操作,來(lái)為我們所用。

如果看過(guò)此系列中屏蔽外鍵的那一篇博客,我們的主角就暗藏在里面,它就是各種Operation

Operation

Ef Core中所有的遷移的工作單元均由Operation組成,例如CreateTableOperation、AlterColumnOperation等等,我們要做的就是將我們的操作組裝為對(duì)應(yīng)的Operation來(lái)模擬遷移的操作,讓Ef Core去生成Sql,那我們?cè)谝欢ǔ潭壬暇捅苊饬?code>Sql的強(qiáng)耦合,生成Sql將有Ef Core的提供程序來(lái)提供支持。

當(dāng)然我們之前提到過(guò),不同的提供程序可能有些實(shí)現(xiàn)是沒(méi)有的,例如微軟官方就不提供AlterColumnOperation,直接采用的暴力的DropAdd,我們只需重寫IMigrationsSqlGenerator中對(duì)應(yīng)的實(shí)現(xiàn)即可。

使用Operation有兩種方法實(shí)現(xiàn):

  • 直接拼接Operation
  • 類似于遷移文件的寫法

直接拼接Operation

直接拼接Operation需要我們創(chuàng)建對(duì)應(yīng)的Operation并且填充里面的主要信息,生成Sql時(shí),需要拿到DbContext內(nèi)部的IMigrationsSqlGenerator作為服務(wù),用于生成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);
}

類似于遷移文件的寫法

類似于遷移文件的寫法實(shí)現(xiàn)時(shí),和遷移文件中展現(xiàn)的部分基本一樣,生成Sql時(shí),需要構(gòu)建一個(gè)MigrationBuilder并且提供你要使用的Ef Core提供程序,項(xiàng)目里需要引用該提供程序。隨后即可生成對(duì)應(yīng)的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: "數(shù)據(jù)Id"),
            Content = table.Column<string>(type: "longtext", nullable: false, comment: "表單冗余數(shù)據(jù)")
        },
        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);
}

總結(jié)

以上是生活随笔為你收集整理的Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。