相关文章推荐
霸气的骆驼  ·  连接MySql报错Unknown ...·  昨天    · 
追风的牛肉面  ·  python pandas ...·  1 年前    · 
强悍的大蒜  ·  浅谈电子数据质量问题及解决方法_审计署网站·  1 年前    · 
博学的牛肉面  ·  Internet 快捷方式 - Win32 ...·  2 年前    · 
文质彬彬的拐杖  ·  表格表头行列与表身不对齐_A_one2010 ...·  2 年前    · 
Code  ›  EntityFramework系列:MySql的RowVersion开发者社区
mysql数据库 时间戳 mysql update语句 mysql
https://cloud.tencent.com/developer/article/1623432
追风的羽毛球
2 年前
作者头像
皇上得了花柳病
0 篇文章

EntityFramework系列:MySql的RowVersion

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 小辰的技术分享 > EntityFramework系列:MySql的RowVersion

EntityFramework系列:MySql的RowVersion

作者头像
皇上得了花柳病
发布 于 2020-05-04 21:24:14
941 0
发布 于 2020-05-04 21:24:14
举报

无需修改实体和配置,在MySql中使用和SqlServer一致的并发控制。修改RowVersion类型不可取,修改为Timestamp更不可行。Sql Server的RowVersion生成一串唯一的二进制保证Row的版本,无关TimeStamp,更无论TimeStamp的精度问题。使用MySql触发器只能解决uuid的插入的默认值和更新的随机值,由于MySql的自身为了防止无限递归的策略,它的触发器无法在当前表的触发器中更新当前表,所以触发器无法实现更新在SqlServer中由数据库生成的RowVersion字段的值。所以MySql中的RowVersion只能由应用程序赋值。

在EF中采用IsConcurrencyToken配置后RowVersion即自动用于where子句中用于比较Row Version,通过重写SaveChanges方法在每次添加和更新时设置RowVersion的值即可实现在更新时同时比较Row Version的当前版本和更新Row Version的目的,同时可以正确的取回更新后的Row Version值。

1.定义并发控制字段

public interface IRowVersion
          byte[] RowVersion { get; set; }
      }

2.配置并发控制字段

protected override void OnModelCreating(DbModelBuilder modelBuilder)
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            modelBuilder.Configurations.AddFromAssembly(typeof(MySqlDbContext).Assembly);
            modelBuilder.Properties().Where(o => typeof(IRowVersion).IsAssignableFrom(o.DeclaringType)&&o.PropertyType==typeof(byte[])&&o.Name=="RowVersion")
                .Configure(o => o.IsConcurrencyToken().HasDatabaseGeneratedOption(DatabaseGeneratedOption.None));
            Database.SetInitializer(new MySqlDbInitializer());
        }

3.手动对RowVersion赋值

public override int SaveChanges()
            this.ChangeTracker.DetectChanges();
            var objectContext = ((IObjectContextAdapter)this).ObjectContext;
            foreach (ObjectStateEntry entry in objectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Added))
                var v = entry.Entity as IRowVersion;
                if (v != null)
                    v.RowVersion = System.Text.Encoding.UTF8.GetBytes(Guid.NewGuid().ToString());
            return base.SaveChanges();
        }

4.检查生成的Sql语句

UPDATE `Customer` SET `PhoneNumber`=@gp1, `RowVersion`=@gp2 WHERE (`Id` = 1) AND (`RowVersion` = @gp3)
-- @gp1: '635655975120384389' (Type = String, IsNullable = false, Size = 18)
-- @gp2: 'System.Byte[]' (Type = Object, IsNullable = false, Size = 36)
-- @gp3: 'System.Byte[]' (Type = Object, IsNullable = false, Size = 36)

5.查看数据中的RowVersion

image

6.准备测试代码

public static void Test()
            var db1 = GetContext();
            var customer1 = db1.Set<Customer>().FirstOrDefault();
            customer1.PhoneNumber="t1";
            using (var db2 = GetContext())
 
推荐文章
霸气的骆驼  ·  连接MySql报错Unknown system variable 'language'_dbeaver unknown system variable
昨天
追风的牛肉面  ·  python pandas csv文件中对字典取值 按行按列取值_python按列读取csv-CSDN博客
1 年前
强悍的大蒜  ·  浅谈电子数据质量问题及解决方法_审计署网站
1 年前
博学的牛肉面  ·  Internet 快捷方式 - Win32 apps | Microsoft Learn
2 年前
文质彬彬的拐杖  ·  表格表头行列与表身不对齐_A_one2010的博客-CSDN博客
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号