2021年6月6日星期日

关于MySql使用EFCore CodeFirst 自定义RowVersion并发字段的解决办法

依赖包版本:MySql.EntityFrameworkCore v5.0.3.1

RowVersion字段的作用:在增/删/改...数据时,先判断该数据的RowVersion字段是否发生改变来实现乐观锁的效果。

在SqlServer中,设置并发字段时可以在代码中采用byte[]类型字段来存储数据库中timestamp类型的数据;

但在MySql中,RowVersion需要应用程序赋值。这里存储Guid值实现版本号控制。

  1. 定义并发控制字段

    public class AdminEntity { 	//对应MySql数据库中的字段类型是varbinary(4000)  public byte[] RowVersion { get; set; } }

  2. 配置实体关系映射

    protected override void OnModelCreating(ModelBuilder modelBuilder)  	{   modelBuilder.Entity<AdminEntity>(entity =>   {    entity.ForMySQLHasCharset("utf8");    entity.ForMySQLHasCollation("utf8_general_ci");    entity.ToTable("T_Admins");    entity.Property(e => e.RowVersion)     .HasColumnName("rowVersion")     .IsConcurrencyToken();//注意这里要使用IsConcurrencyToken()而不是IsRowVersion()   });	}

      

  3. 重写数据库上下文的SaveChanges()方法

    public override int SaveChanges()  {  		//检查数据库更改   this.ChangeTracker.DetectChanges(); 		//筛选新增/修改的实体对象   var modifiedEntities = this.ChangeTracker    .Entries()    .Where(x => x.State == EntityState.Modified || x.State == EntityState.Added)    .Select(x => x.Entity)    .ToList();   foreach (var entity in modifiedEntities)   {    //存储一个新的Guid值    entity?.GetType().GetProperty("RowVersion")     ?.SetValue(entity, Encoding.Default.GetBytes(Guid.NewGuid().ToString()));   }   return base.SaveChanges();  }

  4. 检查生成的Sql语句

  5. 查看数据库的数据

  6. 测试验证并发字段是否可用

    public void Test()  {   using (MyDbContext db = new MyDbContext())   {    var admin1 = db.AdminSet.FirstOrDefault();    admin1.AdminName = "admin11";    using (zzmqDbContext db2 = new zzmqDbContext())    {     var admin2 = db2.AdminSet.FirstOrDefault();     admin2.AdminName = "admin22";     db2.SaveChanges();    }    db.SaveChanges();   }  }

  7. 执行结果

     ok,说明并发字段起作用了。










原文转载:http://www.shaoqun.com/a/786273.html

跨境电商:https://www.ikjzd.com/

prime:https://www.ikjzd.com/w/129

铭宣海淘:https://www.ikjzd.com/w/1551

wario:https://www.ikjzd.com/w/887

rfq:https://www.ikjzd.com/w/251


依赖包版本:MySql.EntityFrameworkCorev5.0.3.1RowVersion字段的作用:在增/删/改...数据时,先判断该数据的RowVersion字段是否发生改变来实现乐观锁的效果。在SqlServer中,设置并发字段时可以在代码中采用byte[]类型字段来存储数据库中timestamp类型的数据;但在MySql中,RowVersion需要应用程序赋值。这里存储Guid值实
Infibeam:https://www.ikjzd.com/w/308
美国商标:https://www.ikjzd.com/w/465
CashCowPro:https://www.ikjzd.com/w/528
菲律宾PS认证:https://www.ikjzd.com/w/1568
东杰智能:https://www.ikjzd.com/w/1967
Tictail:https://www.ikjzd.com/w/2199
深兰科技:https://www.ikjzd.com/w/1517
口述:我是一个被抛弃的全职先生(4/4):http://lady.shaoqun.com/m/a/47024.html
恋爱3年的男友与闺密有了婚约:http://lady.shaoqun.com/m/a/270222.html
办公室老板和我相处好爽很开心 口述与老板的办公室故事:http://lady.shaoqun.com/m/a/275103.html
口述:老婆被闺蜜洗脑后求我参与换妻:http://lady.shaoqun.com/a/70305.html
乡村野地里的趣事 口述青春懵懂的我竟然暗恋上了农村妇女:http://lady.shaoqun.com/a/269763.html
下面穿裙子,不许穿内裤 口述调教小姨子的刺激往事:http://www.30bags.com/a/254534.html
夜深人不静之公媳 趁我熟睡中公公撑开了我的双腿:http://www.30bags.com/a/254929.html
女网友不甘寂寞找上我 口述我和漂亮女网友的那些事:http://www.30bags.com/m/a/250599.html
长得美却总遭老公怀疑偷情:http://www.30bags.com/m/a/253871.html
无良网友竟然让我找回爱爱的高潮:http://www.30bags.com/m/a/252332.html

没有评论:

发表评论