C# 動態創建類,動態創建表,支持多庫的資料庫維護方案

来源:https://www.cnblogs.com/sunkaixuan/archive/2023/03/21/17240546.html
-Advertisement-
Play Games

簡介 本文主要介紹使用 利用 SqlSugar 來實現多資料庫的維護 ,動態建類CRUD,動態建表 ,全局過濾器 ,跨庫查詢等功能 1、創建表 SqlSugar支持了3種模式的建表(無實體建表、實體建表,實體特性建表),非常的靈活 可以多個資料庫 MYSQL MSSQL ORACLE SQLITE ...


簡介

本文主要介紹使用 利用 SqlSugar  來實現多資料庫的維護 ,動態建類CRUD,動態建表 ,全局過濾器 ,跨庫查詢等功能

 

1、創建表

SqlSugar支持了3種模式的建表(無實體建表、實體建表,實體特性建表),非常的靈活

可以多個資料庫 MYSQL MSSQL ORACLE SQLITE PGSQL 等用同一語法創建資料庫,不需要考慮資料庫的相容性

中間標準:

string  大文本

5.1.3.44-preview06  推薦

[SugarColumn(ColumnDataType = StaticConfig.CodeFirst_BigString)]

string 設置長度的字元串

[SugarColumn(Length=10)]

 public string FieldName{ get; set; } 

int 整數

 public int FieldName{ get; set; }

short 整數小

 public short FieldName{ get; set; }

long 大數字

 public long FieldName{ get; set; }

bool  真假

 public bool FieldName{ get; set; } 

decimal  預設

 public decimal  FieldName{ get; set; }

decimal  自定義

 

//18,2  18,4 18,6 這幾種相容性好

[SugarColumn(Length=18,DecimalDigits=2)]

public decimal  FieldName{ get; set; } 

 

DateTime 時間

public DateTime FieldName{ get; set; }

枚舉 (資料庫存int)

 public 枚舉 FieldName{ get; set; }

byte[] 二進位

public byte[]  FileInfo{get;set;}

建議:升級到 SqlSugarCore 5.1.3.46-preview09 及以上

對多庫支持了比較好

SqlServer特殊配置:和他庫不同一般選用Nvarchar,可以使用這個配置讓他和其他資料庫區分(其他庫是varchar)

     DbType = SqlSugar.DbType.SqlServer,     ConnectionString ="字元串",     IsAutoCloseConnection = true,

     MoreSettings=new ConnMoreSettings() {

           SqlServerCodeFirstNvarchar= true, 

     }

 

 

1.1通過特性建表

我們可以通過創建實體來進行建表

public class CodeFirstTable1
{
        [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]
        public int Id { get; set; } 
        public string Name { get; set; }
        //ColumnDataType 自定格式的情況 length不要設置 (想要多庫相容看4.2和9)
        [SugarColumn(ColumnDataType = "Nvarchar(255)")]
        public string Text { get; set; }
        [SugarColumn(IsNullable = true)]//可以為NULL
        public DateTime CreateTime { get; set; }
}
 
/***創建單個表***/
db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(CodeFirstTable1));//這樣一個表就能成功創建了
/***手動建多個表***/
db.CodeFirst.SetStringDefaultLength(200)
.InitTables(typeof(CodeFirstTable1),typeof(CodeFirstTable2)); 

建表特性如下

名稱描述
IsIdentity 是否創建自增標識
IsPrimaryKey 是否創建主鍵標識
ColumnName 創建資料庫欄位的名稱(預設取實體類屬性名稱)
ColumnDataType

創建資料庫欄位的類型

用法1: “varchar(20)” 不需要設置長度

用法2:      不設置該參數   系統會根據C#類型自動生成相應的資料庫類型 

用法3:       多庫相容可以用 :看標題9

IsIgnore ORM不處理該列
ColumnDescription 備註 表註釋 (新版本支持XML文件)
Length 長度 設成10會生成   xxx類型(10), 沒括弧的不設置
IsNullable 是否可以為null默為false
DecimalDigits 精度 如 decimal(18,2) length=18,DecimalDigits=2
OracleSequenceName 設置Oracle序列,設置後該列等同於自增列
OldColumnName 修改列名用,這樣不會新增或者刪除列
IndexGroupNameList 已棄用 ,新用法看文檔4.3
UniqueGroupNameList 已棄用, 新用法看文檔4.3

註意:有2個屬性用處不同

DefaultValue 

IsOnlyIgnoreInsert 

DefaultValue=預設值 用來建表設置欄位預設值

IsOnlyIgnoreInsert=true  插入數據時取預設值

很多情況需要2個一起使用

如果只建表不插入數據用1個 

如果建表並且插入數據用2個

 2.2無特性建表

如果我們的實體不需要加特性,那麼我們可以通過特性方式建表

SugarClient db = new SqlSugarClient(new ConnectionConfig()
{
    DbType = DbType.SqlServer,
    ConnectionString = Config.ConnectionString3,
    InitKeyType = InitKeyType.Attribute,
    IsAutoCloseConnection = true,
    ConfigureExternalServices = new ConfigureExternalServices()
    {
        EntityService = (s, p) =>
        {
            //如果是Order實體進行相關配置
            p.IfTable<Order>()
            .UpdateProperty(it => it.id, it =>
            {
                it.IsIdentity = true;
                it.IsPrimarykey = true;
            })
            .UpdateProperty(it => it.Name, it => {
                it.Length = 100;
                it.IsNullable = true;
  
            })
            .OneToOne(it => it.Item, nameof(Order.ItemId));
              
            //如果Custom實體進行相關配置
             p.IfTable<Custom>()
             .UpdateProperty(it => it.id, it =>
             {
                it.IsIdentity = true;
                it.IsPrimarykey = true;
             })
              .UpdateProperty(it => it.Text, it => {
                it.DataType= StaticConfig.CodeFirst_BigString;//支持多庫的MaxString用法
              })
              
                          
            //可以結合全局邏輯一起使用,下麵的和上面的有衝突的話,下麵會覆蓋上面的
               
              
            //統一設置 nullable等於isnullable=true
            //低版本C#看標題2.2 
             if(p.IsPrimaryKey==false&&new NullabilityInfoContext()
                         .Create(c).WriteState is NullabilityState.Nullable)
             {
                           p.IsNullable = true;
             }
              
               
               
        }
    }
});
//性能說明:
//EntityService 相同實體只會執行一次性不需太操作

1.3 無實體建表

功能與實體建類一模一樣,如果使用SqlSugar中間標準可以支持多個資料庫一套代碼建表

 var type = db.DynamicBuilder().CreateClass("UnitEntityA",
                new SugarTable()
                {
                    TableDescription = "表備註",
                    //DisabledUpdateAll=true 可以禁止更新只創建
                }
            )
           .CreateProperty("Id", typeof(int), new SugarColumn() { IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "列備註" }) 
           .CreateProperty("Name", typeof(string), new SugarColumn() {Length=200, ColumnDescription = "列備註" })
           .BuilderType();
 
            db.CodeFirst.InitTables(type);

  

3、資料庫維護

SqlSugar有一套資料庫維護API,並且能夠很好的支持多種資料庫,例如備份資料庫等常用功能

//例1 獲取所有表
var tables = db.DbMaintenance.GetTableInfoList(false);//true 走緩存 false不走緩存
foreach (var table in tables)
{
     Console.WriteLine(table.Description);//輸出表信息
      
     //獲取列信息
     //var columns=db.DbMaintenance.GetColumnInfosByTableName("表名",false);
}
 
//例2
db.DbMaintenance.IsAnyTable("tablename",false)//驗證表名是否緩存不走緩存

所以API

GetDataBaseList 獲取所有資料庫名稱 List
GetViewInfoList 查詢所有視圖 List
GetTableInfoList 獲取所有表,查詢所有的表 (GetTableInfoList(是否緩存)) List
GetColumnInfosByTableName

獲取列根據表名,獲取欄位,欄位信

息GetColumnInfosByTableName(表名,是否緩存)

List
GetIsIdentities 獲取自增列 List
GetPrimaries 獲取主鍵 List
IsAnyTable 表是否存在,判斷表存不存在 ( IsAny(表名,是否緩存)) bool
IsAnyColumn 列是否存在 bool
IsPrimaryKey 主鍵是否存在 bool
IsIdentity 自增是否存在 bool
IsAnyConstraint 約束是否存在 bool
DropTable 刪除表 bool
TruncateTable 清空表 bool
CreateTable

看標題 1.1,1.2,1.3

bool
AddColumn 添加列 bool
UpdateColumn 更新列 bool
AddPrimaryKey 添加主鍵 bool
DropConstraint 刪除約束 bool
BackupDataBase 備份庫 bool
DropColumn 刪除列 bool
RenameColumn 重命名列 bool
AddDefaultValue 添加預設值 bool
AddTableRemark 添加表描述,表註釋 bool
AddColumnRemark 添加列描述,表註釋 bool
DeleteColumnRemark 刪除列描述,表註釋 bool
RenameTable 重命名錶 bool
CreateIndex 創建索引,唯一約束(唯一索引)  bool
IsAnyIndex 索引是否存在  bool
GetIndexList 獲取所有索引  
GetProcList 獲取所有存儲過程  

 

2、跨庫支持

可以自動識別在哪個庫

實體

 [TenantAttribute("1")]//對應ConfigId
  public class C1Table
  {
     public string Id { get; set; }
  }
    
  [TenantAttribute("2")]
  public class C2Table
  {
      public string Id { get; set; }
  }

查詢

//通過ConfigId進行資料庫區分
var db = new SqlSugarClient(new List<ConnectionConfig>()
{
 //這兒聲名所有上下文都生效
 new ConnectionConfig(){ConfigId="0",DbType=DbType.SqlServer,ConnectionString=..,IsAutoCloseConnection=true},
 new ConnectionConfig(){ConfigId="1",DbType=DbType.MySql,ConnectionString=..,IsAutoCloseConnection=true  }
});
//自動跨庫聯表查詢
var query5 = db.QueryableWithAttr<Order>()//如果MySql和SqlServer自動支持同伺服器的跨庫聯表查詢
         .LeftJoin<Custom>   ((o, cus ) => o.CustomId == cus.Id)//多個條件用&&
         .LeftJoin<OrderDetail> ((o, cus, oritem) => o.Id == oritem.OrderId)
         .Where(o => o.Id == 1)  
         .Select((o, cus , oritem) => new ViewOrder { Id = o.Id, CustomName = cus.Name })
         .ToList();  
//手動跨庫聯表查詢 ,這種方式結合dblink可以跨伺服器
var query5 = db.Queryable().As("xxx.表名")
         .LeftJoin<Custom>   ((o, cus ) => o.CustomId == cus.Id ,"yyyy.表名") 
         .LeftJoin<OrderDetail> ((o, cus, oritem) => o.Id == oritem.OrderId ,"zzzz.名錶")
         .Where(o => o.Id == 1)  
         .Select((o, cus , oritem) => new ViewOrder { Id = o.Id, CustomName = cus.Name })
         .ToList(); 

插入

db.InsertableWithAttr(list).Execommand()

更新

 

db.UpdateableWithAttr(list).Execommand()

  

刪除

db.UpdateableWithAttr(list).Execommand() 

 只要實體配置了資料庫,就不要考慮換庫了,直接使用,並且支持事務

 

 3、過濾器

SqlSugar支持了全新的過濾器,可以是介面,集成該介面的類都生效,支持多表查詢

db.QueryFilter
.AddTableFilter<IDeletedFilter>(it => it.IsDeleted==false)//IDeletedFilter是自定義介面,繼承這個介面的實體有效
.AddTableFilterIF<ITenantFilter>(isAdmint==false,it=>it.OrgId==用戶OrgId);//ITenantFilter自定義介面
 
//用例1:單條語句清空,隻影響當前語句
db.Queryable<Order>().ClearFilter().ToList();//所有過濾器都無效
db.Queryable<Order>().ClearFilter<IDeletedFilter>().ToList();//只有IDeletedFilter過濾器無效
db.Queryable<Order>().ClearFilter<IDeletedFilter,ITenantFilter>().ToList();//IDeletedFilter+ITenantFilter無效
   
//用例2:當前上下文清空 ,不會影響其他請求,只是當前請求清空
db.QueryFilter.Clear();
db.QueryFilter.Clear<IDeletedFilter>(); 
 
//用例3:清空並還原 ,不會影響其他請求,只是當前請求清空
db.QueryFilter.ClearAndBackup();//有多個重載 ClearAndBackup<T,T2>();
db.Queryable<Order>().ToList();
db.QueryFilter.Restore();//還原過濾器 (適合下麵代碼還需要過濾器情況)

 

4、子查詢升級

1. ToList() 可以直接查詢一個對象

2. First()  可以直接查單個對象

3.ToList(it=>it.Id) 可以查List<int>一個欄位集合

4..SelectStringJoin(z => z.Name, ",") 子查詢將一列用逗號拼接成字元串

 var list=db.Queryable<Order>()
 .Select(it => new
         {
           CustomId = it.CustomId,
           OrderId = it.Id,
           OrderName = it.Name,
           CustomList = SqlFunc.Subqueryable<Custom>().Where(c => c.Id == it.CustomId).ToList()
         })
        .ToList();

  

5、自定義類型支持

5.1 自定義類型轉換器

下麵只是講解怎麼定義轉換器,ORM自帶的功能就包含下麵功能,只是用來講解

public class DictionaryConvert : ISugarDataConverter
{
public SugarParameter ParameterConverter<T>(object value, int i)
{
//該功能ORM自帶的IsJson就能實現這裡只是用這個用例來給大家學習
var name = "@myp" + i;
var str = new SerializeService().SerializeObject(value);
return new SugarParameter(name, str);
}

public T QueryConverter<T>(IDataRecord dr, int i)
{
//打斷點調試
//該功能ORM自帶的IsJson就能實現這裡只是用這個用例來給大家學習
var str = dr.GetValue(i) + "";
return new SerializeService().DeserializeObject<T>(str);
}
}
//使用自定義轉換器
[SugarColumn(ColumnDataType="varchar(2000)",SqlParameterDbType=typeof(DictionaryConvert))]
public Dictionary<string, object> DcValue { get; set; }//5.1.3.53-preview08 

現有類型支持

5.1 json類型

https://www.donet5.com/Home/Doc?typeId=1232

5.2 枚舉類型 

int存儲:直接用就行了

public DbType DcValue { get; set; }

string存儲:高版本如下寫法

[SugarColumn(ColumnDataType="varchar(20)",SqlParameterDbType=typeof(EnumToStringConvert))]
public DbType DcValue { get; set; }

 

3.資料庫獨有類型支持
看左邊菜單 【資料庫特性】 該菜單下麵有 SqlServer菜單或者MySql菜單等 , 針對不同資料庫都有專門的介紹

 

6、動態建類,CRUD

如果用DataTable和字典去操作資料庫,那麼在多庫相容上是不夠用的,很多實體功能不能用,比如過濾器和AOP等等

SqlSugar支持了 動態建類,來實現CRUD

//動態建類可以繼承介面有重載
var type = db.DynamicBuilder().CreateClass("table1", new SugarTable()
    {
    })
    .CreateProperty("Id", typeof(int),new SugarColumn() { IsPrimaryKey = true, IsIdentity = true })
    .CreateProperty("Name",typeof(string), new SugarColumn() { })
    .WithCache()//緩存起來根據表名和欄位名組合的KEY
    .BuilderType();

    db.CodeFirst.InitTables(type);
            
    var  value= db.DynamicBuilder().CreateObjectByType(type,new Dictionary<string, object>() { { "Id", 1 }, { "Name", "jack" } });
           
    db.InsertableByObject(value).ExecuteCommand();
    db.UpdateableByObject(value).ExecuteCommand();
    db.DeleteableByObject(value).ExecuteCommand();
    db.StorageableByObject(value).ExecuteCommand();//插入或者更新
    db.Queryable<object>().AsType(type).Filter(type).ToList();

 

總結

SqlSugar在2021年到2022年大量的開源應用使用了SqlSugar,帶動了SqlSugar的快速發展,我這邊要感謝大家

Admin.NET通用管理平臺

ZrAdminNetCore 後臺

管理Yi框架(Ruoyi Vue)

SimpleAdmin (new)

vboot-netmagic.net (Vue2.0)

網關採集系統(Blazor)

RuYiAdmin

CoreShop商城

Blog.Core

YuebonCore

企業級框架Furion   

WebFirst

騰訊APIJSON.NET

WaterCloud微服務

ViperFamilyBucket應用框架通用後臺

SmartSqlWMS倉庫管理系統a

pevolo-apiFytSoaCms 

開源項目地址:https://www.donet5.com/Home/Doc?typeId=1215

 

喜歡SqlSugar的可以在下麵源碼點個贊,點個關註

SqlSugar源碼: https://github.com/DotNetNext/SqlSugar/ 

 


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

-Advertisement-
Play Games
更多相關文章
  • 模塊化的基本概念 什麼是模塊化? 模塊化是解決一個複雜問題時,自頂向下逐層把系統劃分為若幹個模塊的過程,編程中,就是遵守一定規則,把一個大文件拆成獨立並相互依賴的多個小模塊。 模塊化規範 使用什麼樣的語法格式引用模塊和向外暴露成員 CommonJS規範 Node.js 遵循了 CommonJS 的模 ...
  • 資源調度器是 YARN 中最核心的組件之一,它是 ResourceManager 中的一個插拔式服務組件,負責整個集群資源的管理和分配。 Yarn 預設提供了三種可用資源調度器,分別是FIFO (First In First Out )、 Yahoo! 的 Capacity Scheduler 和 ... ...
  • 安全配置Security Defenses 通過對Security Defenses的配置 ,可以對http頭添加相應的安全配置 ,如csp, X-Frame-Options, X-Content-Type-Option等 1 X-Frame-Options 你的網站添加了X-Frame-Optio ...
  • 說明 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。 1. 使用前的準備 參考本人另一篇博客 安裝 Visual Leak Detector 下載 vld-2.5.1-setup.exe 並按步驟安裝 VLD。這一種使用方式的缺點是,當把項目拷貝到別的電腦上編譯運行時,需要按以下流程重新配 ...
  • 由於 Blazor-WebAssembly 是在瀏覽器中運行的,通常不需要執行伺服器代碼,只要有個“窩”能托管並提供相關文件的下載即可。所以,當你有一個現成的 Blazor wasm 項目,沒必要用其他語言重寫,或者你不想用 ASP.NET Core 來托管(有些大材小用了),就可以試試用 node ...
  • 1. Grid佈局 ,(Table 佈局) 兩行兩列佈局, Border 0 行 0 列預設開始 <Window x:Class="WpfApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ...
  • 1 枚舉 enum E_MonsterType//定義了一個枚舉的變數類型 { normal1,//0 boss = 5,//5 normal2,//6,前一個自動加1 } //枚舉和switch語句天生一對,寫switch時能對枚舉類型自動補全 E_MonsterType monsterType ...
  • 用了很多年的Rapid SCADA v5,現在官網已經推出了v6,就簡單寫一下有關v6的安裝指南吧。 本指南面向Windows用戶,不適用於linux用戶 步驟 從官網下載Rapid SCADA最新的RC版本的v6,然後運行壓縮包內的ScadaSetup.exe程式。 FAQ 提示埠占用 Rapi ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...