免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

在FreeSQL中實(shí)現(xiàn)「觸發(fā)器」和軟刪除功能

前言最近做新項(xiàng)目 , 技術(shù)棧 AspNetCore + FreeSQL
這個(gè)ORM真的好用 , 文檔也很完善 , 這里記錄一下兩個(gè)有關(guān)「觸發(fā)器」的功能實(shí)現(xiàn)
修改實(shí)體時(shí)記錄更新時(shí)間模型代碼
【在FreeSQL中實(shí)現(xiàn)「觸發(fā)器」和軟刪除功能】我的模型都是基于這個(gè) ModelBase 派生的 , 自帶三個(gè)屬性字段
public abstract class ModelBase : ISoftDelete {public DateTime CreatedTime { get; set; } = DateTime.Now;public DateTime ModifiedTime { get; set; } = DateTime.Now;public bool IsDeleted { get; set; } = false;}現(xiàn)在要實(shí)現(xiàn)修改每個(gè)實(shí)體的時(shí)候自動(dòng)更新 ModifiedTime 字段
可以使用 FreeSQL 提供的 AOP 里的「審計(jì)屬性值」功能

按照官方的介紹:該功能可以實(shí)現(xiàn)插入/更新時(shí)統(tǒng)一處理某些值 , 比如某屬性的雪花算法值、創(chuàng)建時(shí)間值、甚至是業(yè)務(wù)值 。
創(chuàng)建FreeSQL實(shí)例的時(shí)候配置一下
檢查實(shí)體類型 , 如果是 ModelBase 類型的話 , 那么把 ModifiedTime 字段設(shè)置為當(dāng)前修改的時(shí)間
// 實(shí)體變化事件監(jiān)聽freeSql.Aop.AuditValue += (sender, args) => {if (args.Object is ModelBase modelBase) {modelBase.ModifiedTime = DateTime.Now;}};除此之外 , 還有一個(gè)功能是監(jiān)控實(shí)體修改的 , 我一開始用的這個(gè) , 但是發(fā)現(xiàn)它是在實(shí)體已經(jīng)修改保存完才執(zhí)行 , 無(wú)法實(shí)現(xiàn)記錄更新時(shí)間的功能 。不過(guò)這個(gè)用來(lái)審計(jì)是比較有用的 , 記錄一下~
fsql.Aop.CurdAfter += (s, e) => {Console.WriteLine($"ManagedThreadId:{Thread.CurrentThread.ManagedThreadId};"+$" FullName:{e.EntityType.FullName} ElapsedMilliseconds:{e.ElapsedMilliseconds}ms, {e.Sql}");};實(shí)現(xiàn)軟刪除現(xiàn)在的設(shè)計(jì)為了提高容錯(cuò)性都是做軟刪除 , 這樣誤刪之后還能恢復(fù)數(shù)據(jù) 。
我之前封裝的 DjangoStarter 框架是自己實(shí)現(xiàn)了軟刪除(通過(guò)重寫 DjangoORM 的 objects 管理器實(shí)現(xiàn))
來(lái)到 FreeSQL 這里 , 根據(jù)官方文檔 , 可以直接使用過(guò)濾器功能實(shí)現(xiàn)軟刪除 。
先定義一個(gè)接口
public interface ISoftDelete {bool IsDeleted { get; set; }}其實(shí)用我上面的 ModelBase 也行
不過(guò)我看官方文檔這么用了 , 也就跟著寫~ (接口的泛用性更高 , 可能有些實(shí)體是不需要?jiǎng)?chuàng)建時(shí)間和修改時(shí)間字段的)
然后在創(chuàng)建FreeSQL實(shí)例的時(shí)候配置一下
freeSql.GlobalFilter.Apply<ISoftDelete>("IsDeleted", a => a.IsDeleted == false);這樣讀取數(shù)據(jù)的時(shí)候 , IsDeleted 字段為 true 的項(xiàng)目就自動(dòng)過(guò)濾掉了
刪除的時(shí)候不要直接執(zhí)行 repo.Delete  , 而是把 IsDeleted 字段設(shè)置為 true
當(dāng)然也可以像上面的 AOP 一樣 , 把所有刪除操作攔截下來(lái) 。
參考資料
  • FreeSQL文檔 - AOP - https://freesql.net/guide/aop.html
  • FreeSQL文檔 - 過(guò)濾器 - https://freesql.net/guide/filters.html

    經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀