上回說到 FreeSql.DbContext 的規則,以及演示它的執行過程,惋惜當時還不支持「樂觀鎖」,對於更新數據來說並不安全。git
FreeSql 核心庫 v0.3.27 已提供樂觀鎖支持。github
樂觀鎖的原理,是利用實體某字段,如:long version,更新前先查詢數據,此時 version 爲 1,更新時產生的 SQL 會附加 where version = 1,當修改失敗時(即 Affrows == 0)拋出異常。sql
每一個實體只支持一個樂觀鎖,在屬性前標記特性:[Column(IsVersion = true)] 便可。安全
不管是使用 FreeSql/FreeSql.Repository/FreeSql.DbContext,每次更新 version 的值都會增長 1ide
至此,FreeSql.DbContext 的更新操做就安全了。測試
dotnet add package FreeSql.DbContextui
下面演示更新 BigNumber 屬性,爲何定義他爲 string 呢,對於數字的更新 set clicks = clicks + 1,是安全的操做。code
BigInteger 瞭解嗎,咱們就當 BigNumber 是一個超大的數字吧,普通數字沒法表示的。對象
var fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Pooling=true;Max Pool Size=10") .UseAutoSyncStructure(true) .UseLazyLoading(true) .UseNoneCommandParameter(true) .UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText)) .Build(); public class Song { [Column(IsIdentity = true)] public int Id { get; set; } public string BigNumber { get; set; } [Column(IsVersion = true)]//使用簡單 public long versionRow { get; set; } } public class SongContext : DbContext { public DbSet<Song> Songs { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder builder) { builder.UseFreeSql(fsql); } }
當更新時,版本不正確提示如下錯誤,DbContext 將回滾操做:blog
FreeSql.DbContext 實現相似 EFCore 使用方法,跟蹤對象狀態,最終經過 SaveChanges 方法提交事務。
目前是第二個第一版,已實現狀態跟蹤保存(導航屬性的跟蹤暫時不支持)。
配合樂觀鎖這個殺手鐗,FreeSql 愈來愈有 ORM 的影子了。
github: https://github.com/2881099/FreeSql(求星星,謝謝)