zoukankan      html  css  js  c++  java
  • 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

    }

  • 相关阅读:
    NUMBER BASE CONVERSION(进制转换)
    2776 寻找代表元(匈牙利算法)
    最长严格上子序列(二分优化)
    c++ bitset类的使用和简介
    笨小猴 2008年NOIP全国联赛提高组
    三国游戏 2010年NOIP全国联赛普及组
    全国信息学奥林匹克联赛(NOIP2014)复赛 模拟题Day2 长乐一中
    codevs 1704 卡片游戏
    热浪
    全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中
  • 原文地址:https://www.cnblogs.com/keatkeat/p/4270783.html
Copyright © 2011-2022 走看看