因為喜歡所以升級,MyStaging-3.0 繼續

Ron.Liang發表於2020-07-21

我為什麼維護MyStaging

目前該專案只有我一個人在維護,權當學習交流。為什麼要繼續維護呢,說一千道一萬,還是因為喜歡,由於他的簡單易用,從而促使我決定對 MyStaging 進行升級,目前 3.0+的版本和2.1.13 是不相容的兩套體系,3.0+ 體系架構更靈活清晰,可操作性和易用性更強。

歡迎使用 MyStaging

專案地址

https://github.com/lianggx/mystaging

MyStaging 是一款基於 .NETCore 平臺的 ORM 中介軟體,提供簡單易用的接入工具,全鏈路寫法,支援 DbFirst/CodeFirst,而且兩種模式(DbFirst/CodeFirst)可以無縫切換。比如一開始你是先建立資料庫,然後生成了實體,在接下來的開發過程中,改動實體物件後,可以使用CodeFirst進行無縫遷移,自由使用DbFirst/CodeFirst進行遷移工作 。

支援多種資料庫型別,和 EF 不同的是,對單個專案的多路上下文支援中引進了主從資料庫概念,查詢預設從庫,也可以指定主庫,刪除/修改/新增操作預設走主庫,地層還提供了對單個查詢資料的分散式快取操作,可以自由靈活配置,目前 MyStaging 還在持續完善中,歡迎加入 Star/Contributors/Fork。

相關元件

MyStaging一共分為三個部分,分別是:

  • 1、基礎框架 - MyStaging
  • 2、提供程式 - MyStaging.Mysql/MyStaging.PostgreSQL
  • 3、遷移工具 - MyStaging.Gen

在包管理控制檯安裝 MyStaging.Gen 到 dotnet tool 命令

MyStaging.Gen 是一個獨立的資料庫遷移元件,其本質上是一個控制檯程式,你可以單獨下載這個包到本地,也可以將他安裝到 dotnet tool ,安裝到 dotnet tool 後,你就可以在 visual studio 中使用命令進行資料庫的遷移工作。

安裝遷移工具到 dotnet tool

dotnet tool install -g MyStaging.Gen

要使用 MyStaging.Gen 請根據下面的引數說明,執行建立實體物件對映.

--help 檢視幫助
-m [mode,db[DbFirst]/code[CodeFirst],預設為 DbFirst
-t [dbtype[Mysql/PostgreSQL],資料庫提供程式]  required
-d [database,資料庫連線字串] required
-p [project,專案名稱]  required
-o [output,實體物件輸出路徑],預設為 {project}/Models
==============示例==============
  CodeFirst:
  mystaging.gen -m code -t PostgreSQL -p Pgsql -d "Host=127.0.0.1;Port=5432;Username=postgres;Password=postgres;Database=mystaging;"

  DbFirst:
  mystaging.gen -m db -t PostgreSQL -p Pgsql -d "Host=127.0.0.1;Port=5432;Username=postgres;Password=postgres;Database=mystaging;"
================================

** 注意,上面的兩種遷移模式可以實時切換使用,不影響一開始選擇的模式,且無副作用。

如何選擇資料庫提供程式

MyStaging 提供了多種資料庫的支援,目前提供了 PostgreSQL/Mysql 的支援,後續將陸續開發更多提供程式,比如基於 PostgreSQL 進行開發的程式,那麼可以選擇引用包 MyStaing.PostgreSQL。

資料庫 提供程式
PostgreSQL MyStaing.PostgreSQL
Mysql MyStaging.Mysql

遷移過程

當你進行資料庫關係遷移後,MyStaging會在指定的路徑上生成實體物件檔案目錄:Model,該目錄包含了資料庫上下文物件 xxxDbContext 和實體物件的檔案,以 /examples/Mysql 專案為例子,執行遷移後,將生成 Model/MysqlDbContext.cs,該檔案即為上下文物件;相反的,可以使用了CodeFirst進行 Model 實體物件的遷移,MyStaging 會檢查指定程式集的實體物件,當發現物件攜帶 TableAttribute 特性時,MyStaging會認為該物件參與遷移。

    [Table(name: "article", Schema = "mystaging")]
    public partial class Article
    {
        [Column(TypeName = "tinyint(1)")]
        public bool State { get; set; }
        /// <summary>
        ///  主鍵,自增
        /// </summary>
        [PrimaryKey(AutoIncrement = true)]
        public int id { get; set; }
        public int userid { get; set; }
        public string title { get; set; }
        public string content { get; set; }
        public DateTime createtime { get; set; }
        public string IP { get; set; }
    }

屬性遷移

遷移後的實體物件,都是分部類(partial),在有些情況下,我們需要在實體物件上增加一些影子屬性,影子屬性通常指資料庫中存在的欄位,而實體物件中並沒有定義,反之一樣。如果需要定義影子屬性在實體物件中,你只需要在影子屬性上增加特性 NotMappedAttribute 即可。

    [Table(name: "article", Schema = "mystaging")]
    public partial class Article
    {
       [NotMapped]
       public string IP { get; set; }
    }

初始化資料庫上下文

初始化 DbContext 上下文物件時,要求傳入一個配置 StagingOptions,該 StagingOptions 包含了一些必須和可選的配置

public StagingOptions(string name, string master, params string[] slaves)

上面的 StagingOptions 建構函式中的參數列示: name=配置的名稱,master=主資料庫的連線字串,slaves=從庫的連線字串(支援多個),其它沒有出現在建構函式中的屬性,表示可選引數,可選引數包含了 CacheOptions(快取選項)和 Logger(日誌元件),如果你配置了日誌和快取,MyStaging將在某些場景下啟用該設定,比如針對查詢單個物件的主鍵快取,快取還支援分散式快取(IDistributedCache)

最終初始化上下文物件

    // 控制檯應用程式
    static void Main(string[] args)
    {
        var options = new MyStaging.Metadata.StagingOptions("MySql", "server=127.0.0.1;user id=root;password=root;database=mystaging");
        var context = new MysqlDbContext(options);
    }

    // Web應用程式
    public void ConfigureServices(IServiceCollection services)
	{
        var options = new MyStaging.Metadata.StagingOptions("MySql", "server=127.0.0.1;user id=root;password=root;database=mystaging");
        var context = new MysqlDbContext(options);
		services.AddScoped(this.Configuration);
    }

CURD合集

插入

此示例包含單次插入和批量插入

    var article = new Article()
    {
        content = "你是誰?你從哪裡來?要到哪裡去?",
        createtime = DateTime.Now,
        userid = customer.Id,
        IP = "127.0.0.1",
        State = true,
        title = "振聾發聵的人生三問"
    };
    
    var list = new System.Collections.Generic.List<Article>();
    for (int i = 0; i < 10; i++)
    {
        list.Add(article);
    }
    
    // 單個插入
    var newArticle = context.Article.Insert.Add(article);
    // 批量插入
    var affrows = context.Article.Insert.AddRange(list).SaveChange();

更新

與 EF 不同的是,MyStaging的更新採用無附加實體的方式,直接執行更新過程

    var article = context.Article.Update.SetValue(f => f.content, "未來已來,從這裡開始").Where(f => f.id == 1001).SaveChange();

刪除

刪除和更新類似,都是直接執行

    context.Article.Delete.Where(f => f.id == 1001).SaveChange();

查詢

查詢比較複雜,不過基本和 EF 類似的語法

    // 單個查詢
    var article = context.Customer.Select.Where(f => f.Id == 2 && f.Name == "Ron").ToOne();
    // 列表查詢,排序、分頁、分組
    var articles = context.Customer.Select.OrderBy(f => f.Id).Page(1, 10).GroupBy("Name").ToList();
    // 表連線查詢
    var article = context.Article.Select.InnerJoin<Customer>("b", (a, b) => a.userid == b.Id).Where<Customer>(f => f.Id == 2).ToOne();
    // 首欄位查詢,ToScalar 引數可以傳遞 Sql 引數,比如 SUM(x)
    var id = context.Customer.Select.Where(f => f.Id == 2 && f.Name == "Ron").ToScalar<int>("Id");

更多示例,請訪問 /examples

專案地址:https://github.com/lianggx/mystaging

相關文章