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

介紹

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;
            //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一直在努力的變的更好,所有功能都是來自客戶並且經受過長期的用戶實踐,為了能夠給我更多動力

 

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

 

  

Tags: