亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何利用FluentMigrator實(shí)現(xiàn)數(shù)據(jù)庫遷移

 更新時(shí)間:2019年04月04日 11:26:31   作者:Lamond Lu  
這篇文章主要給大家介紹了關(guān)于如何利用FluentMigrator實(shí)現(xiàn)數(shù)據(jù)庫遷移的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

FluentMigrator

Fluent Migrator是一個(gè)基于.NET的遷移框架,你可以像使用Ruby on Rails Migrations一樣使用它。Fluent Migrator的最新版本是3.13版,官網(wǎng)地址https://github.com/fluentmigrator/fluentmigrator。 你可以使用C#編寫數(shù)據(jù)庫遷移類,而不需要編寫任何SQL腳本。從使用方式上看,它非常像EF/EF Core的數(shù)據(jù)庫遷移腳本,但是它支持的數(shù)據(jù)庫類型比EF/EF Core多的多,且不受限與EF/EF Core。

支持的數(shù)據(jù)庫列表

  • Microsoft SQL Server 2017
  • Microsoft SQL Server 2016
  • Microsoft SQL Server 2014
  • Microsoft SQL Server 2008
  • Microsoft SQL Server 2005
  • Microsoft SQL Server 2000
  • Microsoft SQL Server Compact Edition
  • PostgreSQL
  • MySQL 4
  • MySQL 5
  • Oracle
  • Oracle (managed ADO.NET)
  • Oracle (DotConnect ADO.NET)
  • Microsoft JET Engine (Access)
  • SQLite
  • Firebird
  • Amazon Redshift
  • SAP Hana
  • SAP SQL Anywhere
  • DB2
  • DB2 iSeries

Fluent Migrator提供了5個(gè)不同的類庫來支持不同的場(chǎng)景。

Package 描述
FluentMigrator 創(chuàng)建數(shù)據(jù)庫所需的基礎(chǔ)程序集
FluentMigrator.Runner 進(jìn)程內(nèi)執(zhí)行數(shù)據(jù)庫遷移所需的程序集
FluentMigrator.Console 進(jìn)程外執(zhí)行數(shù)據(jù)庫遷移所需的程序集,它兼容.NET 4.0/4.5/.NET Core 2.0
FluentMigrator.MSBuild 兼容.NET 4.0/4.5/.NET Standard 2.0的MSBuild任務(wù)
FluentMigrator.DotNet.Cli 可執(zhí)行數(shù)據(jù)庫遷移的.NET Core CLI工具

入門例子

這里我們首先演示一個(gè)最簡(jiǎn)單的數(shù)據(jù)庫遷移例子,為一個(gè)MySql數(shù)據(jù)庫添加一個(gè)日志表。

創(chuàng)建控制臺(tái)程序

我們使用.NET Core CLI創(chuàng)建一個(gè).NET Core的命令行程序。

# 遷移腳本基礎(chǔ)庫
dotnet add package FluentMigrator

# 遷移腳本運(yùn)行庫
dotnet add package FluentMigrator.Runner

# 針對(duì)MySQL的遷移腳本支持庫
dotnet add package FluentMigrator.Runner.MySQL

# ADO.NET針對(duì)MySQL的驅(qū)動(dòng)器
dotnet add package MySQL.Data

添加第一個(gè)數(shù)據(jù)庫遷移類

未了創(chuàng)建一個(gè)名為L(zhǎng)og的表,這里需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫遷移類

  • Log表中有2個(gè)字段,一個(gè)是Id字段,一個(gè)是Text字段
  • Id字段是Int64類型的主鍵,且自增
  • Text字段是字符串字段
using FluentMigrator;

namespace test
{
 [Migration(20180430121800)]
 public class AddLogTable : Migration
 {
  public override void Up()
  {
   Create.Table("Log")
    .WithColumn("Id").AsInt64().PrimaryKey().Identity()
    .WithColumn("Text").AsString();
  }

  public override void Down()
  {
   Delete.Table("Log");
  }
 }
}

運(yùn)行遷移類

編寫完遷移類之后,我們就可以開始運(yùn)行遷移類了。

Fluent Migrator有兩種運(yùn)行遷移腳本的方式。

  • 使用進(jìn)程內(nèi)執(zhí)行器(推薦)
  • 使用進(jìn)程外執(zhí)行器

使用進(jìn)程內(nèi)執(zhí)行器

所謂的進(jìn)行內(nèi)執(zhí)行器,其實(shí)就是借助FluentMigrator.Runner庫,在程序內(nèi)部手動(dòng)調(diào)用IMigrationRunner接口對(duì)象的MigrateUp方法執(zhí)行數(shù)據(jù)庫遷移。

這里我們可以修改Program.cs文件如下。

 class Program
 {
  static void Main(string[] args)
  {
   var serviceProvider = CreateServices();

   using (var scope = serviceProvider.CreateScope())
   {
    UpdateDatabase(scope.ServiceProvider);
   }
  }

  private static IServiceProvider CreateServices()
  {
   return new ServiceCollection()
    //添加FluentMigrator基礎(chǔ)服務(wù)
    .AddFluentMigratorCore()
    .ConfigureRunner(rb => rb
     //添加MySql 5.0支持
     .AddMySql5()
     //配置連接字符串
     .WithGlobalConnectionString("server=localhost;port=3307;Database=abc;UID=root;PWD=123456")
     //檢索遷移配置
     .ScanIn(typeof(AddLogTable).Assembly).For.Migrations())
    //啟用控制臺(tái)日志
    .AddLogging(lb => lb.AddFluentMigratorConsole())
    //構(gòu)建服務(wù)提供器
    .BuildServiceProvider(false);
  }

  private static void UpdateDatabase(IServiceProvider serviceProvider)
  {
   //初始化進(jìn)程內(nèi)遷移構(gòu)建器
   var runner = serviceProvider.GetRequiredService<IMigrationRunner>();

   //執(zhí)行遷移腳本
   runner.MigrateUp();
  }
 }

啟動(dòng)程序之后,遷移自動(dòng)完成。

 

使用進(jìn)程外執(zhí)行器

如果你想使用進(jìn)行外遷移執(zhí)行器,這里首先需要保證你已經(jīng)安裝了.NET Core 2.1或以上版本的SDK, 因?yàn)槟阈枰褂?NET Core 2.1之后新增的Global Tool功能。

這里我們可以使用命令行,添加FluentMigrator.DotNet.Cli這個(gè)工具

dotnet tool install -g FluentMigrator.DotNet.Cli

安裝完成之后,我們就可以使用這個(gè)工具來做數(shù)據(jù)庫遷移了

dotnet fm migrate -p mysql -c "server=localhost;port=3307;Database=abc;UID=root;PWD=123456" -a ".\bin\Debug\netcoreapp2.1\test.dll"

這個(gè)方法有3個(gè)參數(shù), 第一個(gè)參數(shù)-p指定了數(shù)據(jù)庫的類型,第二個(gè)參數(shù)-c指定了連接字符串,第三個(gè)參數(shù)-a指定了包含遷移類的程序集路徑。

注意:其實(shí)這里還有第四個(gè)參數(shù)command, 可選值為down/up, 如果不指定,默認(rèn)是up, 即運(yùn)行所有還未運(yùn)行過的數(shù)據(jù)庫遷移類。

方法執(zhí)行后,效果和進(jìn)程內(nèi)執(zhí)行器的效果一致。

基本概念

在展示了一個(gè)簡(jiǎn)單示例之后,我們接下來看一下Fluent Migrator中的一些基本概念。

遷移(Migrations)

Fluent Migrator中最基礎(chǔ)的元素是遷移類,每個(gè)遷移類都需要繼承自一個(gè)名為Migration的抽象類,并實(shí)現(xiàn)兩個(gè)抽象方法Up和Down, 顧名思義Up方法即執(zhí)行當(dāng)前的數(shù)據(jù)庫變更,Down方法即回滾當(dāng)前的數(shù)據(jù)庫變更。

[Migration(1)]
public class CreateUserTable : Migration
{
 public override void Up()
 {
  Create.Table("Users");
 }

 public override void Down()
 {
  Delete.Table("Users");
 }
}

這里你可能注意到遷移類的頭部,有一個(gè)Migration的特性,它的值是1, 這里其實(shí)是指定了遷移類執(zhí)行的順序,編號(hào)越小的遷移類越先執(zhí)行(有一部分開發(fā)人員系統(tǒng)會(huì)使用當(dāng)前日期的yyyyMMddHHmmss格式來標(biāo)記遷移類),這個(gè)編號(hào)必須是唯一的,不能重復(fù)。

Fluent接口(Fluent Interface)

Fluent Migrator提供非常豐富的fluent api, 我們可以使用這些api來創(chuàng)建表,列,索引。 基本上你能用到的大部分場(chǎng)景它都支持。

創(chuàng)建表達(dá)式(Create Expression)

你可以使用它創(chuàng)建表達(dá)式來添加表,列,索引,外鍵,組織結(jié)構(gòu)(schema)

Create.Table("Users")
  .WithIdColumn() 
  .WithColumn("Name").AsString().NotNullable();

注:WithIdColumn()是一個(gè)擴(kuò)展方法,它等價(jià)于.WithColumn("Id").AsInt32().NotNullable().PrimaryKey().Identity();

Create.ForeignKey() 
  .FromTable("Users").ForeignColumn("CompanyId")
  .ToTable("Company").PrimaryColumn("Id");

變更表達(dá)式(Alter Expression)

用來變更已存在的表和列

Alter.Table("Bar")
  .AddColumn("SomeDate")
  .AsDateTime()
  .Nullable();
Alter.Table("Bar")
  .AlterColumn("SomeDate")
  .AsDateTime()
  .NotNullable();
Alter.Column("SomeDate")
  .OnTable("Bar")
  .AsDateTime()
  .NotNullable();

刪除表達(dá)式(Delete Expression)

用來刪除表,列,外鍵,組織結(jié)構(gòu)(Schema)

Delete.Table("Users");

刪除多個(gè)列(Delete Multiple Columns)

Fluent Migrator也提供了一個(gè)刪除多列的語法

Delete.Column("AllowSubscription").Column("SubscriptionDate").FromTable("Users");

執(zhí)行腳本(Execute Expression)

允許你執(zhí)行自定義的SQL腳本或執(zhí)行指定的SQL腳本文件

Execute.Script("myscript.sql");
Execute.EmbeddedScript("UpdateLegacySP.sql");
Execute.Sql("DELETE TABLE Users");

這里EmbeddedScript方法也是執(zhí)行指定的SQL腳本文件,但是它的文件來源Embbed Resource中讀取。如果你想使用EmbbedScript只需要將指定的SQL腳本文件的Build Action屬性設(shè)置為Embbed Resource即可。

重命名表達(dá)式(Rename Expression)

允許重命名表或列

Rename.Table("Users").To("UsersNew");
Rename.Column("LastName").OnTable("Users").To("Surname");

數(shù)據(jù)操作表達(dá)式(Data Expressions)

允許對(duì)數(shù)據(jù)庫數(shù)據(jù)進(jìn)行新增/修改/刪除操作

Insert.IntoTable("Users").Row(new { FirstName = "John", LastName = "Smith" });
Delete.FromTable("Users").AllRows(); //刪除所有行
Delete.FromTable("Users").Row(new { FirstName = "John" }); //刪除所有FirstName = John的數(shù)據(jù)行
Delete.FromTable("Users").IsNull("Username"); //刪除所有Username為空的數(shù)據(jù)行
Update.Table("Users").Set(new { Name = "John" }).Where(new { Name = "Johnanna" });

數(shù)據(jù)庫類型判斷表達(dá)式(IfDatabase Expression)

允許根據(jù)數(shù)據(jù)庫類型,執(zhí)行不同的數(shù)據(jù)庫遷移操作

IfDatabase("SqlServer", "Postgres")
  .Create.Table("Users")
  .WithIdColumn()
  .WithColumn("Name").AsString().NotNullable();

IfDatabase("Sqlite")
  .Create.Table("Users")
  .WithColumn("Id").AsInt16().PrimaryKey()
  .WithColumn("Name").AsString().NotNullable();

組織結(jié)構(gòu)存在表達(dá)式(Schema.Exists Expressions)

用來判斷組織結(jié)構(gòu)是否已經(jīng)存在,列如判斷表是否存在,列是否存在等等。

if (!Schema.Table("Users").Column("FirstName").Exists())
{
  this.Create.Column("FirstName").OnTable("Users").AsAnsiString(128).Nullable();
}

配置(Profile)

Fluent Migrator還提供了一個(gè)Profile的特性,使用該配置,開發(fā)人員可以對(duì)針對(duì)的不同的環(huán)境(開發(fā)環(huán)境,測(cè)試環(huán)境,生產(chǎn)環(huán)境等)運(yùn)行不同的腳本。

[Profile("Development")]
public class CreateDevSeedData : Migration
{
  public override void Up()
  {
    Insert.IntoTable( "User" ).Row( new
      {
        Username = "devuser1",
        DisplayName = "Dev User"
      });
  }

  public override void Down()
  {
    //empty, not using
  }
}

和EF/EF Core的腳本遷移比較

Fluent Migrator的數(shù)據(jù)庫腳本遷移與EF/EF Core非常類似。

相似點(diǎn):

  • 當(dāng)我們使用EF/EF Core做數(shù)據(jù)庫遷移的時(shí)候,會(huì)在當(dāng)前數(shù)據(jù)庫中創(chuàng)建一個(gè)__EFMigrationsHistory表,并在其中保存運(yùn)行過的腳本Id。
  • 當(dāng)我們使用Fluent Migrator做數(shù)據(jù)庫遷移的時(shí)候,也會(huì)在數(shù)據(jù)庫中創(chuàng)建一個(gè)VersionInfo表,并在其中保存運(yùn)行過的腳本Id

區(qū)別:

  • EF/EF Core的遷移腳本是根據(jù)EF上下文配置以及最新的ModelSnapshot自動(dòng)生成的,更方便一些。Fluent Migrator的遷移腳本,都需要自己手動(dòng)編寫, 更靈活一些。
  • EF/EF Core每次自動(dòng)生成的遷移文件一個(gè)cs文件一個(gè)Design.cs文件,每個(gè)cs文件中包含了自動(dòng)生成的腳本類,Design.cs里面包含了針對(duì)當(dāng)前遷移類的最新ModelSnapshot, 所以重度使用EF/EF Core, 最后累計(jì)生成的Design.cs文件都會(huì)非常大。Fluent Migrator的每個(gè)遷移類都是自己編寫的,只包含本次遷移的內(nèi)容,所以體積更小。

總結(jié)

本篇中我描述了Fluent Migrator的一些基本用法,以及它與EF/EF Core腳本遷移的區(qū)別, 如果你不是重度EF/EF Core的使用者,可以嘗試一下使用Fluent Migrator來做數(shù)據(jù)庫遷移。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • asp.net 頁面之間傳遞參數(shù)的幾種方法

    asp.net 頁面之間傳遞參數(shù)的幾種方法

    因?yàn)樵陧?xiàng)目中需要在兩個(gè)頁面之間傳遞一些參數(shù),所以總結(jié)出以下幾個(gè)傳遞參數(shù)的方法
    2009-06-06
  • .Net Core 2.2升級(jí)3.1的避坑指南(小結(jié))

    .Net Core 2.2升級(jí)3.1的避坑指南(小結(jié))

    這篇文章主要介紹了.Net Core 2.2升級(jí)3.1的避坑指南,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • .net core部署到windows服務(wù)上的完整步驟

    .net core部署到windows服務(wù)上的完整步驟

    這篇文章主要給大家介紹了關(guān)于.net core部署到windows服務(wù)上的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.net core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • C#可以減少或不使用switch有什么方法

    C#可以減少或不使用switch有什么方法

    減少或不使用switch,大家有什么好的方法,使用工廠方法來處理,可以創(chuàng)建一個(gè)工廠接口,然后每個(gè)方法設(shè)計(jì)為一個(gè)工廠類,并實(shí)現(xiàn)工廠接口,感興趣的朋友可以了解下
    2013-03-03
  • Asp.net(C#)讀取數(shù)據(jù)庫并生成JS文件制作首頁圖片切換效果(附demo源碼下載)

    Asp.net(C#)讀取數(shù)據(jù)庫并生成JS文件制作首頁圖片切換效果(附demo源碼下載)

    這篇文章主要介紹了Asp.net(C#)讀取數(shù)據(jù)庫并生成JS文件制作首頁圖片切換效果的方法,涉及asp.net數(shù)據(jù)庫操作及JavaScript幻燈片生成的相關(guān)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下
    2016-04-04
  • ASP.NET Core模仿中間件方式實(shí)現(xiàn)列表過濾功能

    ASP.NET Core模仿中間件方式實(shí)現(xiàn)列表過濾功能

    這篇文章介紹了ASP.NET Core模仿中間件方式實(shí)現(xiàn)列表過濾功能的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Asp.net中判斷一個(gè)session是否合法的方法

    Asp.net中判斷一個(gè)session是否合法的方法

    今天突然想到一個(gè)判斷session是否合法的做法,asp.net的,之前我們的做法是下面這樣的形式的:
    2013-07-07
  • .NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)接口請(qǐng)求驗(yàn)證

    .NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)接口請(qǐng)求驗(yàn)證

    在響應(yīng)請(qǐng)求處理的過程中,我們經(jīng)常需要對(duì)請(qǐng)求參數(shù)的合法性進(jìn)行校驗(yàn),如果參數(shù)不合法,將不繼續(xù)進(jìn)行業(yè)務(wù)邏輯的處理。本文將介紹如何使用FluentValidation和MediatR實(shí)現(xiàn)接口請(qǐng)求驗(yàn)證,需要的可以參考一下
    2021-12-12
  • .NET使用System.Timers.Timer類實(shí)現(xiàn)程序定時(shí)執(zhí)行

    .NET使用System.Timers.Timer類實(shí)現(xiàn)程序定時(shí)執(zhí)行

    這篇文章介紹了.NET使用System.Timers.Timer類實(shí)現(xiàn)程序定時(shí)執(zhí)行的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Asp.net MVC定義短網(wǎng)址的方法

    Asp.net MVC定義短網(wǎng)址的方法

    這篇文章主要介紹了Asp.net MVC定義短網(wǎng)址的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08

最新評(píng)論