MyStaging 是一款基於 .NETCore 平臺的 ORM 中間件,提供簡單易用的接入工具,全鏈路寫法,支持 DbFirst/CodeFirst,而且兩種模式(DbFirst/CodeFirst)可以無縫切換。比如一開始你是先創建資料庫,然後生成了實體,在接下來的開發過程中,改動實體對象後,... ...
我為什麼維護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