Entity Framework with MySQL 学习笔记一(乐观并发)

在做项目时,通常我们对乐观并发有几种处理模式

1. 告诉用户此数据已被其他人捷足先登,更改了。你就算新一下重来吧。

2.直接把数据覆盖上去,我最大。

3.用被人的数据. 

这里给出 code first 的做法 

复制代码
[Table("product")]
[JsonObject(IsReference = true)]
public class Product
{
    [Key]
    public int id { get; set; }
    public string code { get; set; }
    public DateTime dateCreated { get; set; } 
    [ConcurrencyCheck] //关键
    public DateTime dateModified { get; set; } 
    public virtual List<Category> categories { get; set; }
    public virtual List<Color> colors { get; set; }
}
复制代码

MySQL 要有这个column 

ALTER TABLE `db`.`product` ADD COLUMN `dateModified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

复制代码
using (DB db = new DB())
{

    var product = db.products.Find(1);
    product.code = "mk99";
    try
    {
        db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException ex) //DbUpdateConcurrencyException
    {
        var objContext = ((IObjectContextAdapter)db).ObjectContext;
        var entry = ex.Entries.Single();
        //objContext.Refresh(RefreshMode.ClientWins, entry.Entity);
        objContext.Refresh(RefreshMode.StoreWins, entry.Entity);
        db.SaveChanges(); 
    }                       
}
复制代码

用DBUpdateConcurrencyException捕获异常,然后我们就可以观察这个entry的种种资料来定义我们的处理。

objContext.Refresh 是微软提供的方案, RefreshMode.StoreWins 就是用当前database的最新数据替换本地数据, ClientWins 就是覆盖本地数据到数据库中啦。

 

用 fluent api 

modelBuilder.Entity<Product>()  <--这里要注意 Product 不可以是抽象类
.Property(e => e.rowLastModifiedDT).IsConcurrencyToken();

 

更新 : 

rowVersion 是 byte[] , 使用 SequenceEqual 或 base64 来检查

if (!FAQSQL.rowVersion.SequenceEqual(FAQ.GetEntity().rowVersion))
{
  //concurrency
}

if(Convert.ToBase64String(FAQSQL.rowVersion) == Convert.ToBase64String(FAQ.GetEntity().rowVersion))

{

  //concurrency

}

 

posted @   兴杰  阅读(314)  评论(0编辑  收藏  举报
编辑推荐:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
点击右上角即可分享
微信分享提示