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

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();
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

}

Entity Framework with MySQL 学习笔记一(乐观并发)的更多相关文章

  1. Entity Framework with MySQL 学习笔记一(安装)

    声明 :  数据库是Mysql,本人的程度只到会写sql语句(不会储蓄过程), c# 会基本的ADO.NET数据库访问,LINQ基础. 这篇只做个人学习|温习作用. 新手可以参考,也请高手指正错误, ...

  2. Entity Framework with MySQL 学习笔记一(查看EF和SQL请求日志)

    做数据库的一向来都会很注意请求的次数还有语句.这关系到很多性能的问题. 因此在使用EF的时候如果不了解原理很可能会搞出很糟糕的请求. 所以呢,在还没有搞懂EF前最基本的是你得"看得见&quo ...

  3. Entity Framework with MySQL 学习笔记一(拦截)

    参考 : http://msdn.microsoft.com/en-us/data/dn469464.aspx EF 允许我们在发送SQL请求和返回数据时做一些拦截的动作 比如可以自定义写 log , ...

  4. Entity Framework with MySQL 学习笔记一(验证标签)

    直接上代码 [Table("single_table")] public class SingleTable { [Key] public Int32 id { get; set; ...

  5. Entity Framework with MySQL 学习笔记一(复杂类型 Complex Types)

    有时候我们希望在sql一个表里面的column, 一部分被分化成另一个class 典型的例子是 Address 直接看代码: [Table("member")] public cl ...

  6. Entity Framework with MySQL 学习笔记一(继承)

    基本上sql中要表示继承关系有3中方式. 分别是,1表继承(TPH),2表继承(TPC),3表继承(TPT) 1表 : Person id type name classroom office 1 s ...

  7. Entity Framework with MySQL 学习笔记一(关系整理版)

    1-1 设置 //DataAnnotation 1-1 | 1-0 table //SQLtable : member , columns : memberId, name //SQL basic l ...

  8. Entity Framework with MySQL 学习笔记一(insert,update,delete)

    先说说 insert 吧. 当EF执行insert时,如果我们传入的对象是有关联(1对多等)的话,它会执行多个语句 insert到多个表, 并且再select出来填充我们的属性(因为有些column默 ...

  9. Entity Framework with MySQL 学习笔记一(关系)

    这一篇说说 EF Fluent API 和 DataAnnotations 参考 : http://msdn.microsoft.com/en-us/data/jj591617.aspx http:/ ...

随机推荐

  1. sqlserver2012的审计功能的相关理解

    1.sqlserver2012可以做实例的审计,以及数据库的审计,基本包括了所有的操作.可以符合我们的要求.   2.审计功能需要实例级别的配置数据库级别的配置,实例上建立“审核”,数据库上建立“数据 ...

  2. 工作那些事(四)大公司VS小公司

    都说大公司学做人,小公司学做事.这话有一定的道理,但是也不是绝对的.做人简单地说就是与人打交道,为人处世:做事,对我们来说就是实现需求,解决bug.有句话,是这么说的:有人的地方就有江湖,有江湖,就得 ...

  3. [Javascript] Advanced Reduce: Flatten, Flatmap and ReduceRight

    Learn a few advanced reduction patterns: flatten allows you to merge a set of arrays into a single a ...

  4. SDWebImage 图片缓存机制

    SDWebImage与iOS系统自带的缓存相比,优势是什么? 从iOS5开始,iOS NSURLCache对于原生得HTTP Response做内存和磁盘缓存.每一次缓存命中(缓存命中就是说内存或者磁 ...

  5. -bash: ulimit: open files: cannot modify limit: Operation not permitted

    普通用户登录系统报错,提示: -bash: ulimit: open files: cannot modify limit: Operation not permitted. 处理方法: #vi /e ...

  6. MM32初识(兼容STM32)

    MM32初识(兼容STM32) 资源与开发环境 keil 5.0 MM32 miniboard 提要 stm32入门(MM32兼容) 点亮LED思路简介 GPIO配置 stm32寄存器理解与操作步骤 ...

  7. MaraDNS与DeadWood一起配置为本地机器提供小型化DNS服务

    因为工作测试需要,要在本机装一个环境,可以解析自己命名的域名,即域名->IP的映射服务.在网上找了下,都说是MaraDNS不错.也试了下,在本地配置是没有问题的.从官网上下载的是2-0-11.w ...

  8. HDU3756

    题意:给定三围空间里面某些点,求构造出一个棱锥,将所有点包含,并且棱锥的体积最小. 输入: T(测试数据组数) n(给定点的个数) a,b,c(对应xyz坐标值) . . . 输出: H(构造棱锥的高 ...

  9. Arcgis server - ' packaging failed '

    我在使用ARCCatalog发布地图服务时,报这个错:packaging failed 然后我从头试,发现它提示说我的目录'C:\Users\Administrator\AppData\Local\E ...

  10. 执行start-dfs.sh后,datenode没有启动

    Hadoop2.2.0启动异常 – Incompatible clusterIDs 2014年08月29日 ⁄ 综合 ⁄ 共 2399字 ⁄ 字号 小 中 大 ⁄ 评论关闭 今天启动Hadoop2.2 ...