.NET 5 ORM 八大實用技巧 乾貨 - SqlSugar ORM

孫凱旋發表於2020-11-25

介紹

sqlsugar已經在第一時間完美相容.NET5並且已經有人在使用了, 很多人都擔心用了開源框架遇到問題無法解決,導致前功盡棄,使用SqlSugar你大可放心,除了有詳細文件和幾年的大量使用者積累,

SqlSugar還提供了完整的服務,讓您的專案沒有後顧之憂

 

優點: 簡單易用、功能齊全、高效能、輕量級、服務齊全

支援資料庫:MySql、SqlServer、Sqlite、Oracle 、 postgresql、達夢、人大金倉

 

免費服務

1、基本用法諮詢

2、BUG提交

3、採納建議和需求

4、程式碼開源 可用於任何商用專案 不收取費用 下載

5、qq交流群討論 995692596(空閒) 654015377(1800/2000 擁擠) 726648662((已滿) 225982985 (已滿)

 

實踐技巧1 :效能監控

通過該功能我們能輕鬆的監控到執行超過1秒的sql,並且可以拿 到他的 C#程式碼檔案和行數 和方法

  SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
   {
                DbType = DbType.SqlServer,
                ConnectionString = Config.ConnectionString,
                InitKeyType = InitKeyType.Attribute,
                IsAutoCloseConnection = true
               
   });
    db.Aop.OnLogExecuted = (sql, p) =>
    {
         //執行時間超過1秒
        if (db.Ado.SqlExecutionTime.TotalSeconds > 1) 
        {
//程式碼CS檔名 var fileName= db.Ado.SqlStackTrace.FirstFileName; //程式碼行數 var fileLine = db.Ado.SqlStackTrace.FirstLine; //方法名 var FirstMethodName = db.Ado.SqlStackTrace.FirstMethodName;
//sql
var exesql=sql;
//引數
var sqlpars=p;
//db.Ado.SqlStackTrace.MyStackTraceList[1].xxx 獲取上層方法的資訊 } };

 

實踐功能2:資料變化監控

當我們的程式碼刪了哪具體的程式碼,新增了具體的程式碼,修改了哪個列如果沒有強大的日誌功能將你將無法找回,SqlSugar可以輕鬆實現高安全級別的資料日誌

db.Aop.OnDiffLogEvent = it =>
{
                var editBeforeData = it.BeforeData;//操作前記錄  包含: 欄位描述 列名 值 表名 表描述
                var editAfterData = it.AfterData;//操作後記錄   包含: 欄位描述 列名 值  表名 表描述
                var sql = it.Sql;
                var parameter = it.Parameters;
                var data = it.BusinessData;//這邊會顯示你傳進來的物件
                var time = it.Time;
                var  diffType=it.DiffType;//enum insert 、update and delete  
                  
                //Write logic
};
  
//新增
db.Insertable(new Student() { Name = "beforeName" })
.EnableDiffLogEvent(new {  title="我是插入"}) //啟用日誌並新增業務物件
.ExecuteReturnIdentity();
  
//修改 db.Updateable
<Student>(new Student() { Id = id, CreateTime = DateTime.Now, Name = "afterName", SchoolId = 2 }) .EnableDiffLogEvent() //啟動日誌 .ExecuteCommand();
//刪除 db.Deleteable
<Student>(id) .EnableDiffLogEvent()//啟動日誌 .ExecuteCommand();

 

實踐功能3:JSON型別完美支援

SqlSugar不但支援PgSql的Json array型別外,哪怕你的資料庫沒有JSON型別一樣可以使用JSON物件進行儲存

ublic class UnitJsonTest
{
   [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
   public int Id { get; set; }
    [SqlSugar.SugarColumn(ColumnDataType ="varchar(max)", IsJson = true)]
   public Order Order { get; set; }
   public string Name{get;set;}
}
Db.Insertable(new UnitJsonTest() { Name="json1",Order = new Order { Id = 1, Name = "order1" } }).ExecuteCommand();
var list = Db.Queryable<UnitJsonTest>().ToList();

 

實踐功能4:分庫+分表+多庫事務

1、動態建立資料庫

下面程式碼將會建立db1和db2資料庫

string conn = "server=.;uid=sa;pwd=haosql;database={0}";
var db = new SqlSugarClient(new ConnectionConfig()
{
DbType = SqlSugar.DbType.SqlServer,
ConnectionString = string.Format(conn, "db1"),
InitKeyType=InitKeyType.Attribute
});
db.DbMaintenance.CreateDatabase();
var db2 = new SqlSugarClient(new ConnectionConfig()
{
DbType = SqlSugar.DbType.SqlServer,
ConnectionString = string.Format(conn, "db2")
});
db2.DbMaintenance.CreateDatabase();

2、動態建表

下面程式碼將生成生Order1和Order2 兩張表

//注意db必須是同一個上下文
var db = new SqlSugarClient(new ConnectionConfig()
{
DbType = SqlSugar.DbType.SqlServer,
ConnectionString = ".;xxx",
InitKeyType=InitKeyType.Attribute //這個屬性必須這麼設定

});

db.MappingTables.Add(typeof(Order).Name, typeof(Order).Name + 1);
db.CodeFirst.InitTables(typeof(Order));
db.MappingTables.Add(typeof(Order).Name, typeof(Order).Name + 2);
db.CodeFirst.InitTables(typeof(Order));

3、實體增、刪、查、改

var list= db.Queryable<Order>().AS("Order1").ToList();//查詢Order1的表
//增 刪 改用法和查詢一樣 Inasertable().AS Deleteable().AS Updateable().As

4、跨庫聯表查詢

var list = db.Queryable<Order, OrderItem, Custom>((o, i, c) => o.Id == i.OrderId&&c.Id == o.CustomId)
.AS("xx.order")
.AS<OrderItem>("yy.OrderItem")
.AS<Custom>("zz.Custom")
.Select<ViewOrder>()
.ToList();

5、多切換

SqlSugarClient db = new SqlSugarClient(new List<ConnectionConfig>()
{
new ConnectionConfig(){ ConfigId="1", DbType=DbType.SqlServer, 
ConnectionString=Config.ConnectionString,InitKeyType=InitKeyType.Attribute,IsAutoCloseConnection=true },
new ConnectionConfig(){ ConfigId="2", DbType=DbType.MySql, 
ConnectionString=Config.ConnectionString4 ,InitKeyType=InitKeyType.Attribute ,IsAutoCloseConnection=true}
});

//庫1
try
{
db.BeginTran();
db.Deleteable<Order>().ExecuteCommand();

db.ChangeDatabase("2");//使用庫2
db.Deleteable<Order>().ExecuteCommand();


db.CommitTran();
}
catch
{
db.RollbackTran();
}

 

實踐功能5:無限級別的級聯插入

使用sqlsugar只需要配置主鍵,不需要實體配置任何外來鍵關係就能實現級聯插入

//有自動賦值的外來鍵
db.Insertable(new Order()
{
    Name = "訂單 1",
        CustomId = 1,
        Price = 100,
        CreateTime = DateTime.Now,
        Id = 0,//自增列
        Items = new List<OrderItem>() {
                new OrderItem(){
                    CreateTime=DateTime.Now,
                    OrderId=0,//需要自動獲取訂單的自增列
                    Price=1,
                    ItemId=1
                }
            }
    })
    .AddSubList(it => it.Items.First().OrderId  )//設定item表的OrderId等於訂單自增列
    .ExecuteReturnPrimaryKey();
 

 

實踐功能6:全自動二級快取

當我們用到Redis等操作時,更新資料時需要及時去清理快取會變的非常複雜,SqlSugar支援多表快取,並且更新其中一張表並且能夠清除快取

二緩快取是將結果集進行快取,當SQL和引數沒發生變化的時候從快取裡面讀取資料,減少資料庫的讀寫操作

ICacheService myCache = new HttpRuntimeCache();

  SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()

  {

                ConnectionString = Config.ConnectionString,

                DbType = DbType.SqlServer,

                IsAutoCloseConnection = true,

                ConfigureExternalServices = new ConfigureExternalServices()

                {

                    DataInfoCacheService = myCache //配置我們建立的快取類

                }

   });

db.Queryable<Student>().Where(it => it.Id > 0).WithCache().ToList();//設定快取預設一天

db.Queryable<Student>().WithCache(1000).ToList();//設定具體過期時間

 

刪除資料同時更新快取,插入用和更新也一樣的用法

db.Deleteable<Student>().RemoveDataCache().Where(it => it.Id == 1).ExecuteCommand();

//remove所有引用Student表的快取,包含多表查詢

 

 

實踐功能7:支援對資料庫的多種操作

名稱備註返回型別
GetDataBaseList 獲取所有資料庫名稱 List
GetViewInfoList 獲取所有檢視 List
GetTableInfoList 獲取所有表 List
GetColumnInfosByTableName 獲取列根據表名 List
GetIsIdentities 獲取自增列 List
GetPrimaries 獲取主鍵 List
IsAnyTable 表是否存在 bool
IsAnyColumn 列是否存在 bool
IsPrimaryKey 主鍵是否存在 bool
IsIdentity 自增是否存在 bool
IsAnyConstraint 約束是否存在 bool
DropTable 刪除表 bool
TruncateTable 清空表 bool
CreateTable 建立列(不建議使用,用CodeFirst建表) bool
AddColumn 新增列 bool
UpdateColumn 更新列 bool
AddPrimaryKey 新增主鍵 bool
DropConstraint 刪除約束 bool
BackupDataBase 備份庫 bool
DropColumn 刪除列 bool
RenameColumn 重新命名列 bool
AddTableRemark 新增表描述 bool
AddColumnRemark 新增列描述 bool
DeleteColumnRemark 刪除列描述 bool
RenameTable 重新命名錶 bool

 

實踐功能8:動態SQL完美防注入方案

var orderField = "order';drop table order";
var orderInfo= db.EntityMaintenance.GetEntityInfo<Order>();
 if (orderInfo.Columns.Any(it => it.DbColumnName != orderField)) 
{
    throw new Exception("請不要非法注入");
}
 db.Queryable<Order>().OrderBy(orderField).ToList();

 

SqlSugar一直在努力的變的更好,所有功能都是來自客戶並且經受過長期的使用者實踐,為了能夠給我更多動力

 

原碼下載: https://github.com/sunkaixuan/SqlSugar       只需你點贊,讓我動力十足

 

  

相關文章