我為什麼維護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");