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

来源:https://www.cnblogs.com/viter/archive/2020/07/21/13347863.html
-Advertisement-
Play Games

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • #1 linq介紹 ##1.1 linq產生背景 一個應用服務後臺程式,肯定會需要格式各樣的數據檢索跟操作,而這些數據在過去的這些年裡一般都會包含在關係型資料庫或者xml文件中。 .Net3.5版本發行之前,傳統的數據源訪問方式就是直接對資料庫或者xml文件進行檢索操作。在.Net3.5 Visua ...
  • 最近一個同事遇到進度條載入不出來問題,即使偶爾載入出來了卻不顯示進度, 看到這個問題想到的肯定是把UI線程給占住了, 由於使用了幾個框架,簡單查看框架後,在框架中改為線程調用 問題解決了, 但是在思考一個問題,框架中的代碼我是能夠看到也可以修改,如果是不能更改的框架怎麼辦? 研究了一下,在需要用的地 ...
  • 效果圖預覽 新建UserControl <Border Background="#F3F6F9" Height="50" Width="400" CornerRadius="10" HorizontalAlignment="Stretch"> <Grid Height="Auto"> <Grid.C ...
  • 分散式系統中,有一些需要使用全局唯一ID的場景,這種時候為了防止ID衝突可以使用36位的UUID,但是UUID有一些缺點,首先他相對比較長,另外UUID一般是無序的。有些時候我們希望能使用一種簡單一些的ID,並且希望ID能夠按照時間有序生成。而twitter的snowflake解決了這種需求,最初T... ...
  • <Button Name="button" Content="Hello" Height="100" Width="200" Click="button_Click_2"> <Button.ContentTemplate> <DataTemplate> <Viewbox> <TextBlock>My ...
  • 最近用FFmpeg處理視頻, 提示“”當代碼嘗試讀取或寫入無法訪問的記憶體“”,然後程式退出。已經設置全局異常也沒有捕獲到。 C#調用非托管方法程式容易奔潰,原因是非退托管代碼報的異常未能被捕獲到。記錄一下兩種解決方法: 一、使用配置文件相容以前代碼 為了與舊代碼相容,在app.config添加leg ...
  • 上次課程我們完成了菜單的配置和開發里程碑的劃定。 按照計劃,我們先來開發數據倉庫管理中的數據源管理(對應菜單為:數據倉庫管理 / 數據源),首批支持的數據源是SQL SERVER資料庫。 一、數據源管理功能任務分解 我們將這部分需求分解成以下幾個任務: 1、新建數據源 主要功能是配置一個連接字元串, ...
  • 在本文中,我為創建的自定義的DfaGraphWriter實現奠定了基礎。DfaGraphWriter是公開的,因此您可以如上一篇文章中所示在應用程式中使用它,但它使用的所有類均已標記為internal。這使得創建自己的版本成為問題。要解決此問題,我使用了一個開源的反射庫ImpromptuInterf ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...