在ef给我们带来快速开发体验的同时,还给我们带来了数据并发处理的方便:
首先见识一下,没有对数据进行并发处理的时候的数据情况:
edmx文件中的实体如下图所示:
数据库结构如下图:
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading; 6 using System.IO; 7 8 namespace ConsoleApplication1 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 TTTT tTTT = new TTTT(); 15 tTTT.Start(); 16 } 17 18 } 19 20 21 public class TTTT 22 { 23 24 public void Start() 25 { 26 //申请两个线程 27 ThreadStart ts = new ThreadStart(Update); 28 ThreadStart ts1 = new ThreadStart(Update); 29 Thread t = new Thread(ts); 30 Thread t1 = new Thread(ts); 31 t.Start(); 32 t1.Start(); 33 } 34 35 public void Update() 36 { 37 Model1Container db = new Model1Container(); 38 var test = db.Test.FirstOrDefault(); 39 for (int i = 0; i < 30; i++) 40 { 41 try 42 { 43 //此处用文件达到的效果是延迟时间 44 string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "1.mp3"); 45 using (FileStream fs = new FileStream(path, FileMode.Open)) 46 { 47 byte[] bs = new byte[fs.Length]; 48 test.im = bs; 49 } 50 51 test.Property = i; 52 db.SaveChanges(); 53 54 db.Refresh(System.Data.Objects.RefreshMode.StoreWins,test);//获取数据库中的新的数据 55 var testNow = db.Test.FirstOrDefault(); 56 57 Console.WriteLine(string.Format("===={0}===={1}", i, testNow.Property)); 58 } 59 catch (Exception ex) 60 { 61 Console.WriteLine(string.Format("===={0}====", ex.Message)); 62 } 63 } 64 } 65 66 } 67 }
运行后的结果:
红色标注的就是脏数据,上边还有很多。
设置并发模式,即将属性的“并发模式”,选择为fixed,如下图所示:
运行代码,得出比较友好的异常,结果如下:
注意:
有人会有如下的写法:
1 if (test.EntityState != System.Data.EntityState.Unchanged) 2 { 3 //代码 4 } 5 else 6 { 7 //提示 8 }
这种写法部门解决问题的。并不一定能够弹出提示。