ÒýÑÔ
ÔÚÈí¼þ¿ª·¢¹ý³ÌÖУ¬²¢·¢¿ØÖÆÊÇÈ·±£¼°Ê±¾ÀÕýÓɲ¢·¢²Ù×÷µ¼ÖµĴíÎóµÄÒ»ÖÖ»úÖÆ¡£´Ó
ADO.NET µ½ LINQ to SQL ÔÙµ½Èç½ñµÄ ADO.NET Entity Framework£¬.NET
¶¼Îª²¢·¢¿ØÖÆÌṩºÃÁ¼ºÃµÄÖ§³Ö·½°¸¡£
²¢·¢´¦Àí·½Ê½Ò»°ã·ÖΪÀֹ۱ز¢·¢Ó뱯¹Û±Ø²¢·¢Á½ÖÖ£¬±¾ÎĽ«Îª´ó¼Ò½éÉÜ Entity
Framework ¡¢ LINQ to SQL ÖеIJ¢·¢´¦Àí·½Ê½¡£ÔÚ±¾ÎÄ×îºó£¬½«Ìṩһ¸öÁ˿ɲο¼µÄ·½°¸£¬½áºÏÊÂÎñ
Transaction ´¦Àí¸´ÔÓÐÔ¶ÔÏóµÄ²¢·¢¡£
Ò»¡¢²¢·¢´¦ÀíµÄ¶¨Òå
ÔÚÈí¼þ¿ª·¢¹ý³ÌÖУ¬µ±¶à¸öÓû§Í¬Ê±ÐÞ¸ÄÒ»ÌõÊý¾Ý¼Ç¼ʱ£¬ÏµÍ³ÐèÒªÔ¤ÏÈÖÆ¶¨¶Ô²¢·¢µÄ´¦Àíģʽ¡£²¢·¢´¦ÀíģʽÖ÷Òª·ÖΪÁ½ÖÖ£º
µÚÒ»ÖÖģʽ³ÆÎª±¯¹Ûʽ²¢·¢£¬¼´µ±Ò»¸öÓû§ÒѾÔÚÐÞ¸ÄijÌõ¼Ç¼ʱ£¬ÏµÍ³½«¾Ü¾øÆäËûÓû§Í¬Ê±Ð޸Ĵ˼Ǽ¡£
µÚ¶þÖÖģʽ³ÆÎªÀÖ¹Ûʽ²¢·¢£¬¼´ÏµÍ³ÔÊÐí¶à¸öÓû§Í¬Ê±ÐÞ¸ÄͬһÌõ¼Ç¼£¬ÏµÍ³»áÔ¤Ïȶ¨ÒåÓÉÊý¾Ý²¢·¢ËùÒýÆðµÄ²¢·¢Òì³£´¦Àíģʽ£¬È¥´¦ÀíÐ޸ĺó¿ÉÄÜ·¢ÉúµÄ³åÍ»¡£³£ÓõÄÀÖ¹ÛÐÔ²¢·¢´¦Àí·½·¨ÓÐÒÔϼ¸ÖÖ£º
1.±£Áô×îºóÐ޸ĵÄÖµ¡£
2.±£Áô×î³õÐ޸ĵÄÖµ¡£
3.ºÏ²¢¶à´ÎÐ޸ĵÄÖµ¡£
Ïà¶ÔÓÚLINQ TO SQL ÖеIJ¢·¢´¦Àí·½Ê½£¬Entity Framework
ÖеIJ¢·¢´¦Àí·½Ê½ÊµÏÖÁ˲»Éٵļò»¯£¬ÏÂÃæÎª´ó¼ÒÒ»Ò»½éÉÜ¡£
¶þ¡¢Ä£ÐÍÊôÐԵIJ¢·¢´¦ÀíÑ¡Ïî
ÔÚSystem.Data.Metadata.Edm ÃüÃû¿Õ¼äÖУ¬´æÔÚConcurencyMode
ö¾Ù£¬ÓÃÓÚÖ¸¶¨¸ÅÄîÄ£ÐÍÖеÄÊôÐԵIJ¢·¢Ñ¡Ïî¡£
ConcurencyMode ÓÐÁ½¸ö³ÉÔ±:

µ±Ä£ÐÍÊôÐÔΪĬÈÏÖµ None ʱ£¬ÏµÍ³²»»á¶Ô´ËÄ£ÐÍÊôÐÔ½øÐмì²â£¬µ±Í¬Ò»¸öʱ¼ä¶Ô´ËÊôÐÔ½øÐÐÐÞ¸Äʱ£¬ÏµÍ³»áÒÔÊý¾ÝºÏ²¢·½Ê½´¦ÀíÊäÈëµÄÊôÐÔÖµ¡£
µ±Ä£ÐÍÊôÐÔΪFixed ʱ£¬ÏµÍ³»á¶Ô´ËÄ£ÐÍÊôÐÔ½øÐмì²â£¬µ±Í¬Ò»¸öʱ¼ä¶ÔÊôÐÔ½øÐÐÐÞ¸Äʱ£¬ÏµÍ³¾Í»á¼¤·¢OptimisticConcurrencyException
Òì³£¡£
¿ª·¢ÈËÔ±¿ÉÒÔΪ¶ÔÏóµÄÿ¸öÊôÐÔ¶¨Ò岻ͬµÄ ConcurencyMode Ñ¡ÏѡÏî¿ÉÒÔÔÚ*.csdl ÕÒ¿´µ½£º
<Schema> 2 ...... 3 ...... 4 <EntityType Name="Person"> 5 <Key> 6 <PropertyRef Name="Id" /> 7 </Key> 8 <Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" /> 9 <Property Type="String" Name="FirstName" MaxLength="50" FixedLength="false" Unicode="true" 10 ConcurrencyMode="Fixed" /> 11 <Property Type="String" Name="SecondName" MaxLength="50" FixedLength="false" Unicode="true" /> 12 <Property Type="Int32" Name="Age" /> 13 <Property Type="String" Name="Address" MaxLength="50" FixedLength="false" Unicode="true" /> 14 <Property Type="String" Name="Telephone" MaxLength="50" FixedLength="false" Unicode="true" /> 15 <Property Type="String" Name="EMail" MaxLength="50" FixedLength="false" Unicode="true" /> 16 </EntityType> 17 </Schema> |

Èý¡¢Entity Framework ±¯¹Û²¢·¢
ÔÚÒ»°ãµÄ¿ª·¢¹ý³ÌÖУ¬×î³£ÓõÄÊDZ¯¹Û²¢·¢´¦Àí¡£.NET ÌṩÁËLock¡¢Monitor¡¢Interlocked
µÈ¶à¸öËø¶¨Êý¾ÝµÄ·½Ê½£¬Ëü¿ÉÒÔ±£Ö¤Í¬Ò»¸ö±íÀïµÄ¶ÔÏó²»»áͬʱ±»¶à¸ö¿Í»§½øÐÐÐ޸쬱ÜÃâÁËϵͳÊý¾Ý³öÏÖÂß¼ÐԵĴíÎó¡£
private static object o=new object(); 2 3 public int Update(Person person) 4 { 5 int n = -1; 6 try 7 { 8 lock (o) 9 { 10 using (BusinessEntities context = new BusinessEntities()) 11 { 12 var obj = context.Person.Where(x => x.Id == person.Id).First(); 13 if (obj != null) 14 context.ApplyCurrentValues("Person", person); 15 n = context.SaveChanges(); 16 } 17 } 18 } 19 catch (Exception ex) 20 { ...... } 21 return n; 22 } |
ʹÓñ¯¹Û²¢·¢ËäÈ»ÄÜÓÐЧ±ÜÃâÊý¾Ý·¢ÉúÂß¼ÐԵĴíÎ󣬵«Ê¹Óà lock µÈ·½Ê½Ëø¶¨
Update ·½·¨µÄ²Ù×÷£¬ÔÚÓû§Í¬Ê±¸üÐÂͬһÊý¾Ý±íµÄÊý¾Ý£¬²Ù×÷¾Í»á±»ÑÓʱ»ò½ûÖ¹¡£ÔÚǧÍò¼¶ PV µÄ´óÐÍÍøÂçϵͳµ±ÖÐʹÓñ¯¹Û²¢·¢£¬ÓпÉÄܽµµÍÁËϵͳµÄЧÂÊ£¬´Ëʱ¿ÉÒÔ¿¼ÂÇʹÓÃÀÖ¹Û²¢·¢´¦Àí¡£
ËÄ¡¢Entity Framework ÀÖ¹Û²¢·¢
ΪÁ˽â¾ö±¯¹Û²¢·¢Ëù´øÀ´µÄÎÊÌ⣬ADO.NET Entity Framework ÌṩÁ˸üΪ¸ßЧµÄÀÖ¹Û²¢·¢´¦Àí·½Ê½¡£Ïà¶ÔÓÚLINT
to SQL , ADO.NET Entity Framework ¼ò»¯ÁËÀÖ¹Û²¢·¢µÄ´¦Àí·½Ê½£¬Ëü¿ÉÒÔÁé»îʹÓúϲ¢Êý¾Ý¡¢±£Áô³õ´ÎÊäÈëÊý¾Ý¡¢±£Áô×îÐÂÊäÈëÊý¾ÝµÈ·½Ê½´¦Àí²¢·¢³åÍ»¡£
4.1 ÒԺϲ¢·½Ê½´¦Àí²¢·¢Êý¾Ý
µ±Ä£ÐÍÊôÐ﵀ ConcurencyMode ΪĬÈÏÖµ None £¬Ò»µ©Í¬Ò»¸ö¶ÔÏóÊôÐÔͬʱ±»Ð޸ģ¬ÏµÍ³½«ÒԺϲ¢Êý¾ÝµÄ·½Ê½´¦Àí²¢·¢³åÍ»£¬ÕâÒ²ÊÇ
Entity Framework ´¦Àí²¢·¢³åÍ»µÄĬÈÏ·½Ê½¡£ºÏ²¢´¦Àí·½Ê½ÈçÏ£ºµ±Í¬Ò»Ê±¼äÕë¶Ôͬһ¸ö¶ÔÏóÊôÐÔ×÷³öÐ޸ģ¬ÏµÍ³½«±£´æ×îÐÂÊäÈëµÄÊôÐÔÖµ¡£µ±Í¬Ò»Ê±¼ä¶Ôͬһ¶ÔÏóµÄ²»Í¬ÊôÐÔ×÷³öÐ޸ģ¬ÏµÍ³½«±£´æÒѱ»Ð޸ĵÄÊôÐÔÖµ¡£ÏÂÃæÓÃÁ½¸öÀý×Ó×÷³ö˵Ã÷£º
4.1.1 ͬʱ¸üÐÂÊý¾Ý
ÔÚϵͳÊäÈëÏÂÃæ´úÂ룬»ñÈ¡Êý¾Ý¿âÖеÄPerson£ºId Ϊ24£¬FirstNameΪLeslie,
SecondNameΪLee¡£È»ºóʹÓÃÒì²½·½·¨·ÖÁ½´Îµ÷ÓÃUpdate·½·¨£¬Í¬Ê±¸üÐÂPerson¶ÔÏóµÄÏà¹ØÊôÐÔ£¬µÚÒ»´Î¸üаѶÔÏóµÄ
FirstName ÊôÐÔ¸ÄRose£¬µÚ¶þ´Î¸üаѶÔÏóµÄ SecondName¸ÄΪWang£¬Age¸ÄΪ32¡£ÔÚʹÓÃSaveChanges±£´æ¸üÐÂʱ£¬µÚÒ»¸ö·½·¨ÒѾ°ÑObjectContext1ÖеÄFirstNameÐÞ¸ÄΪRose£¬µ«ÔÚµÚ¶þ¸ö·½·¨ÖеÄObjectContext2ÖеÄFirstNameÒÀÈ»ÊÇLeslie£¬´ËʱÓÉÓÚÈý¸öÊôÐÔµÄConcurencyMode¶¼ÎªÄ¬ÈÏÖµNone£¬ÏµÍ³»áºöÂÔµ±ÖеijåÍ»£¬¶ø½ÓÊÜËùÓеĸüÐÂÐ޸ġ£
public class PersonDAL 2 { 3 public Person GetPerson(int id) 4 { 5 using (BusinessEntities context = new BusinessEntities()) 6 { 7 IQueryable<Person> list=context.Person.Where(x => x.Id == id); 8 return list.First(); 9 } 10 } 11 12 public void Update(Person person) 13 { 14 using (BusinessEntities context = new BusinessEntities()) 15 { 16 //ÏÔʾÊäÈëÐÂÊý¾ÝµÄÐÅÏ¢ 17 Display("Current", person); 18 var obj = context.Person.Where(x => x.Id == person.Id).First(); 19 if (obj != null) 20 context.ApplyCurrentValues("Person", person); 21 22 //ÐéÄâ²Ù×÷£¬±£Ö¤Êý¾ÝÄÜͬʱ¼ÓÈëµ½ÉÏÏÂÎĵ±ÖÐ 23 Thread.Sleep(100); 24 context.SaveChanges(); 25 } 26 } 27 28 delegate void MyDelegate(Person person); 29 30 public static void Main(string[] args) 31 { 32 //ÔÚ¸üÐÂÊý¾ÝǰÏÔʾ¶ÔÏóÐÅÏ¢ 33 PersonDAL personDAL = new PersonDAL(); 34 var beforeObj = personDAL.GetPerson(24); 35 personDAL.Display("Before", beforeObj); 36 37 //¸üÐÂPersonµÄSecondName£¬AgeÁ½¸öÊôÐÔ 38 Person person1 = new Person(); 39 person1.Id = 24; 40 person1.FirstName = "Leslie"; 41 person1.SecondName = "Wang"; 42 person1.Age = 32; 43 person1.Address = "Tianhe"; 44 person1.Telephone = "13660123456"; 45 person1.EMail = "Leslie@163.com"; 46 47 //¸üÐÂPersonµÄFirstNameÊôÐÔ 48 Person person2 = new Person(); 49 person2.Id = 24; 50 person2.FirstName = "Rose"; 51 person2.SecondName = "Lee"; 52 person2.Age = 34; 53 person2.Address = "Tianhe"; 54 person2.Telephone = "13660123456"; 55 person2.EMail = "Leslie@163.com"; 56 57 //ʹÓÃÒì²½·½Ê½Í¬Ê±¸üÐÂÊý¾Ý 58 MyDelegate myDelegate = new MyDelegate(personDAL.Update); 59 myDelegate.BeginInvoke(person1, null, null); 60 myDelegate.BeginInvoke(person2, null, null); 61 62 Thread.Sleep(300); 63 //ÔÚ¸üÐÂÊý¾ÝºóÏÔʾ¶ÔÏóÐÅÏ¢ 64 var afterObj = personDAL.GetPerson(24); 65 personDAL.Display("After", afterObj); 66 Console.ReadKey(); 67 } 68 69 public void Display(string message,Person person) 70 { 71 String data = string.Format("{0}\n Person Message:\n Id:{1} FirstName:{2} "+ 72 "SecondName:{3} Age:{4}\n Address:{5} Telephone:{6} EMail:{7}\n", 73 message, person.Id, person.FirstName, person.SecondName, person.Age, 74 person.Address, person.Telephone, person.EMail); 75 Console.WriteLine(data); 76 } 77 } |
¸ù¾Ý²Ù×÷½á¹û¿ÉÒÔ¿´µ½£¬ÔÚEntity FrameworkµÄĬÈÏ»·¾³Çé¿öÏ£¬ÏµÍ³»áʹÓúϲ¢·½Ê½´¦Àí²¢·¢£¬°ÑÊäÈëÊý¾ÝµÄËùÓÐÐÞ¸ÄÖµ¶¼±£´æµ½µ±Ç°ÉÏÏÂÎĵ±ÖУ¬²¢Í¬Ê±ÐÞ¸ÄÊý¾Ý¿âµ±ÖеÄÖµ¡£

4.1.2 ɾ³ýÓë¸üвÙ×÷ͬʱÔËÐÐ
Entity Framework ÄÜÒÔÍêÉÆµÄ»úÖÆÁé»î´¦Àíͬʱ¸üÐÂͬһ¶ÔÏóµÄ²Ù×÷£¬µ«Ò»µ©É¾³ý²Ù×÷Óë¸üвÙ×÷ͬʱÔËÐÐʱ£¬¾Í¿ÉÄÜ´æÔÚÂß¼ÐÔµÄÒì³£¡£ÀýÈ磺Á½¸ö¿Í»§¶Ëͬʱ¼ÓÔØÁËͬһ¸ö¶ÔÏ󣬵ÚÒ»¸ö¿Í»§¶Ë¸üÐÂÁËÊý¾Ýºó£¬°ÑÊý¾ÝÔÙ´ÎÌá½»¡£µ«ÔÚÌύǰ£¬µÚ¶þ¸ö¿Í»§¶ËÒѾ°ÑÊý¾Ý¿âÖеÄÒÑÓÐÊý¾Ýɾ³ý¡£´Ëʱ£¬ÉÏÏÂÎÄÖеĶÔÏó´¦ÓÚ²»Í¬µÄ״̬µ×Ï£¬½«»áÒý·¢
OptimisticConcurrencyException Òì³£¡£
Óöµ½´ËÒ쳣ʱ£¬¿ÉÒÔÓà try£¨OptimisticConcurrencyException£©{...}
catch {...} ·½Ê½²¶»ñÒì³££¬È»ºóʹÓà ObjectStateManager.ChangeObjectState
·½·¨¸ü¸Ä¶ÔÏóµÄ EntityState ÊôÐÔ¡£°ÑEntityState ¸ü¸ÄΪ Added £¬±»É¾³ýµÄÊý¾Ý±ã»á±»ÔٴμÓÔØ¡£Èô°Ñ
EntityState ¸ü¸ÄΪ Detached ʱ£¬Êý¾Ý±ã»á±»Ë³Àûɾ³ý¡£ÏÂÃæ°Ñ¶ÔÏóµÄ EntityState
ÊôÐÔ¸ü¸ÄΪ Added ×÷ΪÀý×Ó¡£
public class PersonDAL 2 { 3 delegate int MyDelegate(Person person); 4 5 public static void Main(string[] args) 6 { 7 //ÔÚ¸üÐÂÊý¾ÝǰÏÔʾ¶ÔÏóÐÅÏ¢ 8 PersonDAL personDAL = new PersonDAL(); 9 var beforeObj = personDAL.GetPerson(51); 10 personDAL.DisplayProperty("Begin", beforeObj); 11 12 //¸üÐÂPersonµÄÊôÐÔ 13 Person person1 = new Person(); 14 person1.Id = 51; 15 person1.FirstName = "Leslie"; 16 person1.SecondName = "Wang"; 17 person1.Age = 32; 18 person1.Address = "Tianhe"; 19 person1.Telephone = "13660123456"; 20 person1.EMail = "Leslie@163.com"; 21 22 //ʹÓÃÒì²½·½Ê½¸üÐÂÊý¾Ý 23 MyDelegate myDelegate = new MyDelegate(personDAL.Update); 24 IAsyncResult reslut=myDelegate.BeginInvoke(person1, null, null); 25 26 //ͬ²½É¾³ýÔÓÐÊý¾Ý 27 personDAL.Delete(51); 28 //ÏÔʾɾ³ýºóÖØÐ±»¼ÓÔØµÄÊý¾Ý 29 var afterObj = personDAL.GetPerson(myDelegate.EndInvoke(reslut)); 30 personDAL.DisplayProperty("End", afterObj); 31 } 32 33 public Person GetPerson(int id) 34 { 35 using (BusinessEntities context = new BusinessEntities()) 36 { 37 IQueryable<Person> list=context.Person.Where(x => x.Id == id); 38 return list.First(); 39 } 40 } 41 42 //¸üжÔÏó 43 public int Update(Person person) 44 { 45 int returnValue=-1; 46 using (BusinessEntities context = new BusinessEntities()) 47 { 48 var obj = context.Person.Where(x => x.Id == person.Id).First(); 49 //ÏÔʾ¶ÔÏóËù´¦×´Ì¬ 50 DisplayState("Before Update", obj); 51 try 52 { 53 if (obj != null) 54 context.ApplyCurrentValues("Person", person); 55 //ÐéÄâ²Ù×÷£¬±£Ö¤Êý¾ÝÒѾÔÚÊý¾Ý¿âÖб»Ò첽ɾ³ý 56 Thread.Sleep(100); 57 context.SaveChanges(); 58 returnValue = obj.Id; 59 } 60 catch (System.Data.OptimisticConcurrencyException ex) 61 { 62 //°Ñ¶ÔÏóµÄ״̬¸ü¸ÄΪ Added 63 context.ObjectStateManager.ChangeObjectState(obj, System.Data.EntityState.Added); 64 context.SaveChanges(); 65 returnValue=obj.Id; 66 } 67 } 68 return returnValue; 69 } 70 71 //ɾ³ý¶ÔÏó 72 public void Delete(int id) 73 { 74 using (BusinessEntities context = new BusinessEntities()) 75 { 76 var person1 = context.Person.Where(x => x.Id == id).First(); 77 if (person1 != null) 78 context.Person.DeleteObject(person1); 79 context.SaveChanges(); 80 //ÏÔʾ¶ÔÏóÏÖÔÚËù´¦µÄ״̬ 81 DisplayState("After Delete:", person1); 82 } 83 } 84 85 //ÏÔʾ¶ÔÏóÏÖÔÚËù´¦µÄ״̬ 86 public void DisplayState(string message,Person person) 87 { 88 String data = string.Format("{0}\n Person State:{1}\n", 89 message,person.EntityState); 90 Console.WriteLine(data); 91 } 92 //ÏÔʾ¶ÔÏóÏà¹ØÊôÐÔ 93 public void DisplayProperty(string message, Person person) 94 { 95 String data = string.Format("{0}\n Person Message:\n Id:{1} FirstName:{2} " + 96 "SecondName:{3} Age:{4}\n Address:{5} Telephone:{6} EMail:{7}\n", 97 message, person.Id, person.FirstName, person.SecondName, person.Age, 98 person.Address, person.Telephone, person.EMail); 99 Console.WriteLine(data); 100 }
|
¹Û²ìÔËÐвâÊÔ½á¹û£¬µ±ÔËÐÐ Delete ·½·¨£¬¶ÔÏóÒѾÔÚÊý¾Ý¿âÖб»É¾³ý£¬¶ÔÏóµÄEntityState´¦ÓÚ
Detached ״̬¡£´ËʱʹÓà SaveChanges ±£´æ¸üÐÂÊý¾Ýʱ£¬Òý·¢ÁËOptimisticConcurrencyException
Òì³£¡£ÔÚ²¶»ñÒì³££¬°Ñ¶ÔÏó״̬¸ü¸ÄΪ Added £¬ÔÙʹÓÃSaveChanges±£´æÊý¾Ý£¬Êý¾Ý¾ÍÄÜ˳ÀûµØ±£´æµ½Êý¾Ý¿âÖС£µ«ÖµµÃÁôÒ⣬ÒòΪ¶ÔÏóÊÇÔÚɾ³ýºóÖØÐ¼ÓÔØµÄ£¬ËùÒÔ¶ÔÏóµÄ
Id Ò²»á±»Í¬²½¸üС£

ÒԺϲ¢Êý¾ÝµÄ·½Ê½´¦Àí²¢·¢³åÍ»¹ÌÈ»·½±ã¿ì½Ú£¬µ«ÔÚÒµÎñÂß¼½ÏΪ¸´ÔÓµÄϵͳϲ¢²»ÊʺÏʹÓô˴¦Àí·½Ê½¡£±ÈÈçÔÚ³£¼ûµÄOrder¡¢OrderItemµÄ±í¸ñÖУ¬OrderItem
µÄµ¥¼Û£¬ÊýÁ¿»áÖ±½ÓÓ°ÏìOrderµÄ×ÜÌå¼Û¸ñ£¬ÕâÑùʹÓúϲ¢Êý¾ÝµÄ·½Ê½´¦Àí²¢·¢£¬ÓпÉÄÜÒýÆðÂß¼ÐԵĴíÎó¡£´Ëʱ£¬Ó¦¸Ã¿¼ÂÇÒÔÆäËû·½Ê½´¦Àí²¢·¢³åÍ»¡£
4.2 µ±·¢ÉúÊý¾Ý²¢·¢Ê±£¬±£Áô×îÐÂÊäÈëµÄÊý¾Ý
ÒªÑéÖ¤ÊäÈë¶ÔÏóµÄÊôÐÔ£¬±ØÐëÏȰѸÃÊôÐ﵀ ConcurencyMode ÉèÖÃΪ
Fixed£¬ÕâÑùϵͳ¾Í»áʵʱ¼ì²â¶ÔÏóÊôÐÔµÄÊäÈëÖµ¡£
µ±¸ÃÊôÐÔ±»Í¬Ê±¸üУ¬ÏµÍ³±ã»á¼¤·¢ OptimisticConcurrencyException
Òì³£¡£²¶»ñ¸ÃÒì³£ºó£¬¿ÉÒÔʹÓà ObjectContext.Refresh (RefreshMode,object)
Ë¢ÐÂÉÏÏÂÎÄÖиöÔÏóµÄ״̬£¬µ± RefreshMode Ϊ ClientWins ʱ£¬ÏµÍ³½«»á±£³ÖÉÏÏÂÎÄÖеÄÏÖÔÚÓÐÊý¾Ý£¬¼´±£Áô×îÐÂÊäÈëµÄ¶ÔÏóÖµ¡£´ËʱÔÙʹÓÃObjectContext.SaveChanges,
ϵͳ¾Í»á°Ñ×îÐÂÊäÈëµÄ¶ÔÏóÖµ¼ÓÈëÊý¾Ý¿âµ±ÖС£
ÔÚÏÂÃæµÄÀý×Óµ±£¬ÏµÍ³Æô¶¯Ç°Ï顄 Person µÄ FirstName¡¢SecondName
Á½¸öÊôÐ﵀ ConcurencyMode ÊôÐÔÉèÖÃΪFixed£¬Ê¹ÏµÍ³ÄܼàÊÓÕâÁ½¸öÊôÐԵĸü¸Ä¡£ËùÊäÈëµÄÊý¾ÝÖ»ÔÚFirstName¡¢SecondName
Á½¸öÖµÖÐ×÷³öÐ޸ġ£ÔÚÊý¾ÝÌύǰÏÈÒÔ DisplayProperty ·½·¨ÏÔʾÊý¾Ý¿â×î³õµÄÊý¾ÝÊôÐÔ£¬ÔÚÊý¾Ý³õ´Î¸üкóÔٴε÷ÓÃ
DisplayProperty ÏÔʾ¸üкóµÄÊý¾ÝÊôÐÔ¡£ÔÚµÚ¶þ´Î¸üÐÂÊý¾Ýʱ£¬Óɵ÷ÓÃObjectContext.SaveChangesʱ£¬Êý¾Ý¿âÖеÄÊý¾ÝÒѾ±»Ð޸ģ¬Ó뵱ǰÉÏÏÂÎÄObjectContext
µÄÊý¾Ý´æÔÚ³åÍ»£¬ÏµÍ³½«¼¤·¢ OptimisticConcurrencyException Òì³££¬´Ëʱ°ÑÒý·¢Òì³£µÄ¶ÔÏóÊôÐÔÔÙ´ÎÏÔʾ³öÀ´¡£¶ÔÒì³£½øÐд¦Àíºó£¬ÏÔʾÊý¾Ý¿âÖÐ×îÖյĶÔÏóÖµ¡£
public class PersonDAL 2 { 3 delegate void MyDelegate(Person person); 4 5 public static void Main(string[] args) 6 { 7 //ÔÚ¸üÐÂÊý¾ÝǰÏÔʾ¶ÔÏóÐÅÏ¢ 8 PersonDAL personDAL = new PersonDAL(); 9 var beforeObj = personDAL.GetPerson(52); 10 personDAL.DisplayProperty("Before", beforeObj); 11 12 //¸üÐÂPersonµÄFirstName¡¢SecondNameÊôÐÔ 13 Person person1 = new Person(); 14 person1.Id = 52; 15 person1.FirstName = "Mike"; 16 person1.SecondName = "Wang"; 17 person1.Age = 32; 18 person1.Address = "Tianhe"; 19 person1.Telephone = "13660123456"; 20 person1.EMail = "Leslie@163.com"; 21 22 //¸üÐÂPersonµÄFirstName¡¢SecondNameÊôÐÔ 23 Person person2 = new Person(); 24 person2.Id = 52; 25 person2.FirstName = "Rose"; 26 person2.SecondName = "Chen"; 27 person2.Age = 32; 28 person2.Address = "Tianhe"; 29 person2.Telephone = "13660123456"; 30 person2.EMail = "Leslie@163.com"; 31 32 //ʹÓÃÒì²½·½Ê½¸üÐÂÊý¾Ý 33 MyDelegate myDelegate = new MyDelegate(personDAL.Update); 34 myDelegate.BeginInvoke(person1, null, null); 35 myDelegate.BeginInvoke(person2, null, null); 36 //ÏÔʾÍê³É¸üкóÊý¾ÝÔ´ÖеĶÔÓ¦ÊôÐÔ 37 Thread.Sleep(1000); 38 var afterObj = personDAL.GetPerson(52); 39 personDAL.DisplayProperty("After", afterObj); 40 } 41 42 public Person GetPerson(int id) 43 { 44 using (BusinessEntities context = new BusinessEntities()) 45 { 46 IQueryable<Person> list=context.Person.Where(x => x.Id == id); 47 return list.First(); 48 } 49 } 50 51 //¸üжÔÏó 52 public void Update(Person person) 53 { 54 using (BusinessEntities context = new BusinessEntities()) 55 { 56 var obj = context.Person.Where(x => x.Id == person.Id).First(); 57 try 58 { 59 if (obj!=null) 60 context.ApplyCurrentValues("Person", person); 61 //ÐéÄâ²Ù×÷£¬±£Ö¤Êý¾Ý±»Í¬²½¼ÓÔØ 62 Thread.Sleep(100); 63 context.SaveChanges(); 64 //ÏÔʾµÚÒ»´Î¸üкóµÄÊý¾ÝÊôÐÔ 65 this.DisplayProperty("Current", person); 66 } 67 catch (System.Data.OptimisticConcurrencyException ex) 68 { 69 //ÏÔʾ·¢ÉúOptimisticConcurrencyExceptionÒì³£ËùÊäÈëµÄÊý¾ÝÊôÐÔ 70 this.DisplayProperty("OptimisticConcurrencyException", person); 71 72 if (person.EntityKey == null) 73 person.EntityKey = new System.Data.EntityKey("BusinessEntities.Person", 74 "Id", person.Id); 75 //±£³ÖÉÏÏÂÎĵ±ÖжÔÏóµÄÏÖÓÐÊôÐÔ 76 context.Refresh(RefreshMode.ClientWins, person); 77 context.SaveChanges(); 78 } 79 } 80 } 81 82 //ÏÔʾ¶ÔÏóÏà¹ØÊôÐÔ 83 public void DisplayProperty(string message, Person person) 84 { 85 String data = string.Format("{0}\n Person Message:\n Id:{1} FirstName:{2} " + 86 "SecondName:{3} Age:{4}\n Address:{5} Telephone:{6} EMail:{7}\n", 87 message, person.Id, person.FirstName, person.SecondName, person.Age, 88 person.Address, person.Telephone, person.EMail); 89 Console.WriteLine(data); 90 } 91 } |
¹Û²ì²âÊÔ½á¹û£¬¿É¼ûµ±RefreshMode״̬ΪClientWinsʱ£¬ÏµÍ³½«»á±£´æÉÏÏÂÎĵ±ÖеĶÔÏóÊôÐÔ£¬Ê¹Óô˷½·¨¿ÉÒÔÔÚ·¢Éú²¢·¢Ò쳣ʱ±£³Ö×îÐÂÊäÈëµÄ¶ÔÏóÊôÐÔ¡£

4.3 µ±·¢ÉúÊý¾Ý²¢·¢Ê±£¬±£Áô×î³õÊäÈëµÄÊý¾Ý
°Ñ¶ÔÏóÊôÐ﵀ ConcurencyMode ÉèÖÃΪ Fixed ºó£¬Í¬Ê±¸üиÃÊôÐÔ£¬½«»á¼¤·¢
OptimisticConcurrencyException Òì³£¡£´ËʱʹÓà ObjectContext.Refresh
(RefreshMode,object) Ë¢ÐÂÉÏÏÂÎÄÖиöÔÏóµÄ״̬£¬µ± RefreshMode Ϊ StoreWins
ʱ£¬ÏµÍ³¾Í»á°ÑÊý¾ÝÔ´ÖеÄÊý¾Ý´úÌæÉÏÏÂÎÄÖеÄÊý¾Ý¡£
ÒòΪ³õ´Îµ÷Óà SaveChanges£¬Êý¾Ý¿ÉÒԳɹ¦±£´æµ½Êý¾Ý¿â¡£µ«ÊÇÔÚ
ObjectContext ²¢Î´ÊÍ·Åʱ£¬ÔÙ´ÎʹÓà SaveChanges Òì²½¸üÐÂÊý¾Ý£¬¾Í»áÒý·¢OptimisticConcurrencyException
²¢·¢Òì³£¡£µ± RefreshMode Ϊ StoreWins ʱ£¬ÏµÍ³¾Í»á±£Áô³õ´ÎÊäÈëµÄÊý¾ÝÊôÐÔ¡£
´ËÀý×ÓÓëÉÏÃæµÄÀý×ÓÊ®·ÖÏàËÆ£¬Ö»ÊÇ°Ñ RefreshMode ¸ÄΪ StoreWins
¶øÒÑ¡£ÔÚÒµÎñÂß¼½ÏΪ¸´ÔӵĵÄϵͳµ±ÖУ¬½¨ÒéʹÓô˷½Ê½´¦Àí²¢·¢Òì³£¡£ÔÚ±£Áô×î³õÊäÈëµÄÊý¾ÝÐÞ¸ÄÊôÐԺ󣬰ÑÊôÐÔ·µ»¹¸ø¿Í»§£¬Èÿͻ§½øÐжԱȺóÔÙ¾ö¶¨ÏÂÒ»²½µÄ´¦Àí·½Ê½¡£
public class PersonDAL 2 { 3 delegate void MyDelegate(Person person); 4 5 public static void Main(string[] args) 6 { 7 //ÔÚ¸üÐÂÊý¾ÝǰÏÔʾ¶ÔÏóÐÅÏ¢ 8 PersonDAL personDAL = new PersonDAL(); 9 var beforeObj = personDAL.GetPerson(52); 10 personDAL.DisplayProperty("Before", beforeObj); 11 12 //¸üÐÂPersonµÄFirstName¡¢SecondNameÊôÐÔ 13 Person person1 = new Person(); 14 person1.Id = 52; 15 person1.FirstName = "Mike"; 16 person1.SecondName = "Wang"; 17 person1.Age = 32; 18 person1.Address = "Tianhe"; 19 person1.Telephone = "13660123456"; 20 person1.EMail = "Leslie@163.com"; 21 22 //¸üÐÂPersonµÄFirstName¡¢SecondNameÊôÐÔ 23 Person person2 = new Person(); 24 person2.Id = 52; 25 person2.FirstName = "Rose"; 26 person2.SecondName = "Chen"; 27 person2.Age = 32; 28 person2.Address = "Tianhe"; 29 person2.Telephone = "13660123456"; 30 person2.EMail = "Leslie@163.com"; 31 32 //ʹÓÃÒì²½·½Ê½¸üÐÂÊý¾Ý 33 MyDelegate myDelegate = new MyDelegate(personDAL.Update); 34 myDelegate.BeginInvoke(person1, null, null); 35 myDelegate.BeginInvoke(person2, null, null); 36 //ÏÔʾÍê³É¸üкóÊý¾ÝÔ´ÖеĶÔÓ¦ÊôÐÔ 37 Thread.Sleep(1000); 38 var afterObj = personDAL.GetPerson(52); 39 personDAL.DisplayProperty("After", afterObj); 40 } 41 42 public Person GetPerson(int id) 43 { 44 using (BusinessEntities context = new BusinessEntities()) 45 { 46 IQueryable<Person> list=context.Person.Where(x => x.Id == id); 47 return list.First(); 48 } 49 } 50 51 //¸üжÔÏó 52 public void Update(Person person) 53 { 54 using (BusinessEntities context = new BusinessEntities()) 55 { 56 var obj = context.Person.Where(x => x.Id == person.Id).First(); 57 try 58 { 59 if (obj!=null) 60 context.ApplyCurrentValues("Person", person); 61 //ÐéÄâ²Ù×÷£¬±£Ö¤Êý¾Ý±»Í¬²½¼ÓÔØ 62 Thread.Sleep(100); 63 context.SaveChanges(); 64 //ÏÔʾµÚÒ»´Î¸üкóµÄÊý¾ÝÊôÐÔ 65 this.DisplayProperty("Current", person); 66 } 67 catch (System.Data.OptimisticConcurrencyException ex) 68 { 69 //ÏÔʾ·¢ÉúOptimisticConcurrencyExceptionÒì³£ËùÊäÈëµÄÊý¾ÝÊôÐÔ 70 this.DisplayProperty("OptimisticConcurrencyException", person); 71 72 if (person.EntityKey == null) 73 person.EntityKey = new System.Data.EntityKey("BusinessEntities.Person", 74 "Id", person.Id); 75 //±£³ÖÊý¾ÝÔ´ÖжÔÏóµÄÏÖÓÐÊôÐÔ 76 context.Refresh(RefreshMode.StoreWins, person); 77 context.SaveChanges(); 78 } 79 } 80 } 81 82 //ÏÔʾ¶ÔÏóÏà¹ØÊôÐÔ 83 public void DisplayProperty(string message, Person person) 84 { 85 String data = string.Format("{0}\n Person Message:\n Id:{1} FirstName:{2} " + 86 "SecondName:{3} Age:{4}\n Address:{5} Telephone:{6} EMail:{7}\n", 87 message, person.Id, person.FirstName, person.SecondName, person.Age, 88 person.Address, person.Telephone, person.EMail); 89 Console.WriteLine(data); 90 } 91 } |
¹Û²ì²âÊÔ½á¹û£¬¿É¼ûµ± RefreshMode ״̬Ϊ StoreWins
ʱ£¬ÏµÍ³½«»áÒÔÊý¾ÝÔ´ÖеÄÊý¾Ý´úÌæÉÏÏÂÎĵ±ÖеĶÔÏóÊôÐÔ¡£ÔÚÒµÎñÂß¼½ÏΪ¸´ÔӵĵÄϵͳµ±ÖУ¬½¨ÒéʹÓô˷½Ê½´¦Àí²¢·¢Òì³£¡£

Îå¡¢»Ø¹Ë LINQ to SQL ²¢·¢´¦ÀíµÄ·½Ê½
Entity Framework µ±Öмò»¯Á˲¢·¢´¦ÀíµÄ·½Ê½£¬È»¶øÎ¹ʶøÖªÐ£¬LINQ
to SQL Öв¢·¢´¦ÀíËùʹÓõķ½Ê½Ò²ÖµµÃ»Ø¹Ëһϡ£ÏÂÃæ½«Óë´ó¼ÒÒ»Æð»Ø¹ËһϠLINQ to SQL µ±Öв¢·¢´¦ÀíµÄ·½Ê½¡£
Óë Entity Framework ÏàËÆ£¬LINQ to SQL Öбí¸ñµÄÿ¸öÁж¼Îª¿ÉÒÔÉ趨²»Í¬´¦Àí·½Ê½£¬ÊôÐÔ
UpdateCheck (¸üмì²é) µÄĬÈÏֵΪ Always£¬¼´ÏµÍ³»áÔÚĬÈÏÇé¿öϼì²éÊôÐԵIJ¢·¢×´Ì¬¡£Èô°ÑÊôÐÔ¸ÄΪ
WhenChanged£¬¼´µ±¸ÃÊôÐÔ·¢Éú¸Ä±äʱ£¬ÏµÍ³²Å»á¶ÔÆä½øÐмì²â¡£Èô°ÑÊôÐÔ¸ÄΪ Nerver , Õâʱϵͳ½«²»»á¶Ô´ËÊôÐÔ½øÐмì²é£¬×ÜÊǽÓÊÜ×îÐÂÒ»´ÎµÄÊäÈëÖµ¡£

´¦Àí LINQ to SQL ²¢·¢£¬×îÎªÖØÒªµÄÊÇÒÔÏÂÁ½¸ö·½·¨£º
DataContext.SubmitChanges(ConflictMode)
DataContext.ChangeConflicts.ResolveAll(RefreshMode); |
SubmitChanges ½«¶Ô¼ìË÷µ½µÄ¶ÔÏóËù×öµÄ¸ü¸Ä·¢Ë͵½»ù´¡Êý¾Ý¿â£¬²¢Í¨¹ý
ConflictMode Ö¸¶¨²¢·¢³åͻʱҪ²ÉÈ¡µÄ²Ù×÷ ¡£µ±Ñ¡Ôñ ConflictMode.FailOnFirstConflict
ʱ£¬Èô¼ì²âµ½µÚÒ»¸ö²¢·¢³åÍ»´íÎóʱ£¬ÏµÍ³»áÁ¢¼´Í£Ö¹¶Ô¸üÐÂÊý¾Ý¿âµÄ³¢ÊÔ¡£µ±Ñ¡Ôñ Conflict.ContinueOnConflict
ʱ£¬ÏµÍ³»á³¢ÊÔÔËÐжÔÊý¾Ý¿âµÄËùÓиüС£

ResolveAll ÄÜʹÓÃÖ¸¶¨²ßÂÔ½â¾ö¼¯ºÏÖеÄËùÓгåÍ»£¬µ±Ñ¡Ôñ RefreshMode.KeepChanges
ʱ£¬ÏµÍ³»áÇ¿ÖÆ Refresh ·½·¨±£³Öµ±Ç°ÉÏÏÂÎĵÄÊý¾ÝÖµ¡£µ±Ñ¡ÔñRefreshMode.OverwriteCurrentValues,
ϵͳ»áÓÃÊý¾Ý¿âµÄÖµ¸²¸Çµ±Ç°ÉÏÏÂÎÄÖеÄÊý¾ÝÖµ¡£µ±Ñ¡Ôñ RefreshMode.KeepCurrentValues,
ϵͳ»á°Ñµ±Ç°ÉÏÏÂÎĵĸüÐÂÖµÓëÊý¾Ý¿âÖеÄÖµ½øÐкϲ¢´¦Àí¡£

µ± Person ±í¸ñµÄ¶à¸öÁÐµÄ UpdateCheck ÊôÐÔ¶¼ÎªÄ¬ÈÏÖµ Always ʱ£¬¶à¸ö¿Í»§Í¬Ê±¸üдËÊý¾Ý±í£¬×îºóʹÓÃ
DataContext.SubmitChanges(ConflictMode.ContinuOnConflict)
ͬʱÌá½»Êý¾Ýʱ£¬ÏµÍ³¾Í»áÊͷųö ChangeConflictException Òì³£¡£ÏµÍ³¿ÉÒÔÒÔ²¶»ñ´Ë²¢·¢Òì³£ºó£¬ÔÙ¾ö¶¨²ÉÈ¡
KeepChanges¡¢KeepCurrentValues¡¢OverwriteCurrentValues
µÈ·½Ê½´¦ÀíÊý¾Ý¡£
public class PersonDAL 2 { 3 delegate void MyDelegate(Person person); 4 5 static void Main(string[] args) 6 { 7 //ÔÚ¸üÐÂÊý¾ÝǰÏÔʾ¶ÔÏóÐÅÏ¢ 8 PersonDAL personDAL = new PersonDAL(); 9 var beforeObj = personDAL.GetPerson(52); 10 personDAL.DisplayProperty("Before", beforeObj); 11 12 //¸üÐÂPersonµÄFirstName¡¢SecondNameÊôÐÔ 13 Person person1 = new Person(); 14 person1.Id = 52; 15 person1.FirstName = "Mike"; 16 person1.SecondName = "Wang"; 17 person1.Age = 32; 18 person1.Address = "Tianhe"; 19 person1.Telephone = "13660123456"; 20 person1.EMail = "Leslie@163.com"; 21 22 //¸üÐÂPersonµÄFirstName¡¢SecondNameÊôÐÔ 23 Person person2 = new Person(); 24 person2.Id = 52; 25 person2.FirstName = "Rose"; 26 person2.SecondName = "Chen"; 27 person2.Age = 32; 28 person2.Address = "Tianhe"; 29 person2.Telephone = "13660123456"; 30 person2.EMail = "Leslie@163.com"; 31 32 //ʹÓÃÒì²½·½Ê½¸üÐÂÊý¾Ý 33 MyDelegate myDelegate = new MyDelegate(personDAL.Update); 34 myDelegate.BeginInvoke(person1, null, null); 35 myDelegate.BeginInvoke(person2, null, null); 36 37 //ÏÔʾ¸üкóµÄ¶ÔÏóÐÅÏ¢ 38 Thread.Sleep(1000); 39 var afterObj = personDAL.GetPerson(52); 40 personDAL.DisplayProperty("After", afterObj); 41 Console.ReadKey(); 42 } 43 44 public void Update(Person person) 45 { 46 using (BusinessDataContext context = new BusinessDataContext()) 47 { 48 try 49 { 50 var person1 = context.Person.Where(x => x.Id == person.Id).First(); 51 if (person1 != null) 52 { 53 person1.Address = person.Address; 54 person1.Age = person.Age; 55 person1.EMail = person.EMail; 56 person1.FirstName = person.FirstName; 57 person1.SecondName = person.SecondName; 58 person1.Telephone = person.Telephone; 59 } 60 //ÐéÄâ²Ù×÷£¬±£Ö¤¶à¸öֵͬʱÌá½» 61 Thread.Sleep(100); 62 context.SubmitChanges(ConflictMode.ContinueOnConflict); 63 DisplayProperty("SubmitChanges Success",person); 64 } 65 catch (ChangeConflictException ex) 66 { 67 //±£³Ö×îÐÂÊäÈëµÄÉÏÏÂÎÄÊý¾Ý 68 DisplayProperty("ChangeConflictException", person); 69 context.ChangeConflicts.ResolveAll(RefreshMode.KeepChanges); 70 context.SubmitChanges(); 71 } 72 } 73 } 74 75 public Person GetPerson(int id) 76 { 77 using (BusinessDataContext context = new BusinessDataContext()) 78 { 79 var person = context.Person.Where(x => x.Id == id); 80 return person.First(); 81 } 82 } 83 84 //ÏÔʾ¶ÔÏóÏà¹ØÊôÐÔ 85 public void DisplayProperty(string message, Person person) 86 { 87 String data = string.Format("{0}\n Person Message:\n Id:{1} FirstName:{2} " + 88 "SecondName:{3} Age:{4}\n Address:{5} Telephone:{6} EMail:{7}\n", 89 message, person.Id, person.FirstName, person.SecondName, person.Age, 90 person.Address, person.Telephone, person.EMail); 91 Console.WriteLine(data); 92 } 93 } |
Àý×Óµ±ÖÐʹÓà RefreshMode.KeepChanges µÄ·½Ê½´¦Àí²¢·¢£¬ÏµÍ³»á±£´æ×îÐÂÊäÈëµÄÊý¾Ý¡£¹Û²ì²âÊÔ½á¹û£¬µ±ÏµÍ³·¢ÉúµÚÒ»´Î¸üÐÂʱ£¬Êý¾Ý³É¹¦±£´æµ½Êý¾Ý¿âµ±ÖС£ÔÚ
DataContext δÊÍ·Åǰ£¬ÔÙ´ÎÊäÈëÊý¾Ý£¬Òý·¢ÁËChangeConflictExceptionÒì³£¡£ÔÚ²¶»ñ´Ë²¢·¢Òì³£ºó£¬ÏµÍ³ÒÔ
RefreshMode.KeepChanges ·½Ê½½øÐд¦Àí£¬×îºóÐÂÊäÈëµÄÊý¾Ý³É¹¦±£´æµ½Êý¾Ý¿âµ±ÖС£

Áù¡¢½áºÏÊÂÎñ´¦Àí²¢·¢³åÍ»
Entity Framework ÖÐÒѾÓбȽÏÍêÉÆµÄ»úÖÆ´¦Àí²¢·¢£¬µ«Ê¹ÓÃÀÖ¹ÛÐÔ²¢·¢´¦ÀíÊý¾Ý£¬Ò»µ©¶à¸ö¿Í»§¶Ëͬʱ¸üÐÂͬһÕűí¸ñµÄͬһ¸ö¶ÔÏóʱ£¬½«»á¼¤·¢
OptimisticConcurrencyException Òì³££¬ÏµÍ³±ØÐëÔ¤Ïȶ¨Öƺô¦Àí·½°¸¶Ô´Ë²¢·¢Òì³£½øÐд¦Àí¡£½áºÏÊÂÎñ´¦Àí²¢·¢Òì³££¬ÊÇÒ»¸ö±È½Ï¸ßЧµÄÊý¾Ý¹ÜÀí·½Ê½¡£ÊÂÎñÄܶÔÊý¾ÝµÄ¸üнøÐмì²â£¬Ò»µ©·¢ÏÖÒì³££¬±ã»áʵÏֻعö¡£±¾ÎÄ»áʹÓó£ÓõÄÒþʽÊÂÎñ
TransactionScope ×÷ΪÀý×Ó½øÐнéÉÜ£¬¶ÔÊÂÎñµÄÏêϸ½éÉÜ£¬¿ÉÒԲο¼ ¡°C#×ۺϽÒÃØ¡ª¡ªÏ¸ËµÊÂÎñ¡±¡£ÆäʵÔÚCodePlexÍøÕ¾¿ÉÒÔ¿´µ½£¬Î¢ÈíÔÚObjectContext.Savechanges·½·¨µÄʵÏÖÖУ¬ÒѾʹÓÃÁËÊÂÎñÓÃÓÚ±£Ö¤Êý¾ÝÊäÈëµÄÕýÈ·ÐÔ¡£µ«¶ÔÓÚÒ»²¿·Ö¶à±í²Ù×÷µÄ·½·¨ÖУ¬ÒÀÈ»ÐèҪʹÓÃÊÂÎñÔÚ¶à±í¸üÐÂʱ±£Ö¤Ò»ÖÂÐÔ¡£
ÔÚʵ¼Ê¿ª·¢¹ý³Ìµ±ÖУ¬×î³£Óö¼ûµÄÊÇÔÚ¶©µ¥¸üеĹý³Ì£¬ÏµÍ³»á°Ñ¿Í»§µÄ¸öÈËÐÅÏ¢£¬ÊÕ»õµØÖ·£¬ÁªÏµ·½Ê½£¬¶©µ¥×ÜÌå±í£¬¶©µ¥Ã÷ϸ±íµÈ¶à±í¸ñµÄÊý¾ÝͬʱÌá½»¡£´Ëʱ£¬¿ÉÒÔÑ¡Ôñ²»Í¬µÄ·½·¨½øÐд¦Àí¡£
ÔÚOrderÓëOrderItemÕâÖÖÖ÷´Ó¹ØÏµ±íÖУ¬¿ÉÒÔʹÓðѴαí¸ñÔÓеÄÓйØÊý¾ÝÈ«²¿É¾³ý£¬È»ºó¸ù¾ÝÐÂÊäÈëµÄ¶ÔÏóÖØÐ¼ÓÔØµÄ·½·¨½øÐд¦Àí¡£´Ë´¦Àí·½·¨µÄºÃ´¦ÔÚÓÚ£¬±ÜÃâÐÂÊäÈëµÄÊý¾ÝÓë´Î±í¸ñµÄÔÓÐÊý¾Ý´æÔÚ³åÍ»£¬µ«Îª´ËÒ»µ©·¢Éú²¢·¢¾ÍÓпÉÄÜÒýÆð¶à´Î¼ÓÔØµÄΣÏÕ¡£
¶ÔÓÚ Person£¬Order ÕâÑù²»Í¬µÄʵÌ壬һ°ã»á°Ñ²Ù×÷·ÅÖÃÓÚ²»Í¬µÄ²Ù×÷¶ÔÏóÖУ¬ÒÔ²»Í¬µÄObjectContext½øÐд¦Àí¡£ÎªÁ˱£Ö¤²Ù×÷¾ßÓÐÒ»ÖÂÐÔ£¬¿ÉʹÓÃÊÂÎñ°Ñ¶à¸ö±í¸ñµÄ²Ù×÷ºÏ²¢ÔÚÒ»Æð¡£´Ëʱ£¬¼´Ê¹ÏµÍ³·¢ÉúÒì³££¬¶à¸ö±íÊý¾ÝÒ²ÄÜʵÏÖͬ²½»Ø¹ö£¬±ÜÃâÒýÆðÂß¼ÉϵĴíÎó¡£
µ«Ê¹ÓÃÊÂÎñ±ØÐë×¢Ò⣬һµ©·¢Éú²¢·¢£¬ÈÝÒ×Òý·¢ÊÂÎñËøÒì³££º "ÊÂÎñ(½ø³Ì
ID 53)ÓëÁíÒ»¸ö½ø³Ì±»ËÀËøÔÚ Ëø ×ÊÔ´ÉÏ£¬²¢ÇÒÒѱ»Ñ¡×÷ËÀËøÎþÉüÆ· ...... " ¡£ÕâÊÇÒòΪ¶à¸öÊÂÎñ±»Í¬Ê±´¥·¢£¬ÔÚʵÏÖ¸üеĹý³ÌÖÐÊÂÎñ¶¼¶Ô²¿·ÖÊý¾ÝʵÏÖËø¶¨¶øÒýÆð¡£ËùÒÔʹÓÃÊÂÎñʱÐèÒªÒýÈëËøÀ´±ÜÃâ´ËÇé¿ö³öÀ´¡£
public class OrderDAL 2 { 3 public void UpdateOrder(Order order) 4 { 5 using (BusinessEntities context = new BusinessEntities()) 6 { 7 Order objResult = context.Order.Include("OrderItem") 8 .Where(x => x.Id == order.Id).First(); 9 10 if (objResult != null) 11 { 12 try 13 { 14 //°ÑÔÓÐÏà¹ØµÄOrderItem¶ÔÏóÈ«²¿É¾³ý 15 foreach (var item in objResult.OrderItem.ToList()) 16 context.OrderItem.DeleteObject(item); 17 //¸üРOrder¶ÔÏóµÄÊôÐÔ£¬¼ÓÈë¶ÔӦеÄOrderItem¶ÔÏó 18 context.ApplyCurrentValues("BusinessEntities.Order", order); 19 foreach (var item in order.OrderItem.ToList()) 20 { 21 //ÏȰÑOrderItemµÄµ¼º½ÊôÐÔOrder±äΪ¿ÕÖµ 22 //·ñÔòϵͳ»áÏÔÊ¾ÖØ¸´²åÈëµÄÒì³£ 23 item.Order = null; 24 context.OrderItem.AddObject(item); 25 } 26 context.SaveChanges(); 27 } 28 catch (System.Data.OptimisticConcurrencyException ex) 29 {......} 30 catch (Exception ex) 31 {......} 32 } 33 } 34 } 35 } 36 37 public class PersonDAL 38 { 39 //¸üÐÂPerson¶ÔÏó 40 public void Update(Person person) 41 { 42 using (BusinessEntities context = new BusinessEntities()) 43 { 44 var obj = context.Person.Where(x => x.Id == person.Id).First(); 45 if (obj != null) 46 context.ApplyCurrentValues("Person", person); 47 context.SaveChanges(); 48 } 49 } 50 } 51 52 public class UpdateOrder 53 { 54 private OrderDAL orderDAL = new OrderDAL(); 55 private PersonDAL personDAL = new PersonDAL(); 56 57 public void DoWork(Person person, Order order) 58 { 59 lock(this) 60 { 61 //²Ù×÷ʱ½«Í¬Ê±¸üÐÂOrder¡¢OrderItem¡¢PersonÈý¸ö±í¸ñ 62 //ΪÁ˱ÜÃâÆäÖÐÒ»¸ö²Ù×÷³öÏÖ´íÎó¶øÒýÆðÊý¾ÝÂß¼ÐÔ´íÎó 63 //ӦʹÓÃÊÂÎñ×÷Ϊ±£»¤£¬ÔÚ³öÏÖ´íÎóʱʵÏÖͬ²½»Ø¹ö 64 using (TransactionScope scope = new TransactionScope()) 65 { 66 orderDAL.UpdateOrder(order); 67 personDAL.Update(person); 68 scope.Complete(); 69 } 70 } 71 } 72 } |
ÔÚ¸´ÔӵĶà±íÊý¾Ý´¦Àí¹ý³ÌÖУ¬ÍƼöʹÓÃÊÂÎñ½áºÏËøÀ´½øÐд¦Àí¡£
ÖµµÃ×¢ÒâµÄÊÇ£ºÊ¹ÓÃÀÖ¹Û²¢·¢Ó뱯¹Û²¢·¢·½Ê½×î´óÇø±ðÔÚÓÚ£¬´«Í³µÄ±¯¹Û²¢·¢´¦Àí·½Ê½²»ÔÊÐíͬһʱ¿ÌÓжà¸ö¿Í»§¶Ë´¦Àíͬһ¸öÊý¾Ý±íÖеÄÏàͬ¶ÔÏ󣬵«ÒòΪ¿Í¹ÛÒòÊýµÄÓ°Ï죬ϵͳÄÑÒÔ×Ðϸ±æÈϿͻ§Í¬Ê±½øÐÐÐ޸ĵÄÊÇ·ñͬһ¸öÊý¾ÝÏËùÒÔ»ù±¾µÄ×ö·¨ÊÇʹÓÃËø°Ñ¸üжÔÏó½øÐÐËø¶¨¡£µ«Èç´ËÒ»À´£¬ÎÞÂÛ¿Í»§Í¬Ê±¸üеÄÊÇ·ñͬһ¸öÊý¾ÝÏ²Ù×÷¶¼½«»á±»ÑÓʱ»ò½ûÖ¹¡£»»¾ä»°Ëµ£¬ÎÞÂÛÐèÒª¸üеÄÊÇÏàͬ¶ÔÏó»¹ÊDz»Í¬¶ÔÏ󣬿ͻ§¶Ë¶¼²»ÄÜͬʱ¸üÐÂͬһ¸öÊý¾Ý±í¡£ÔÚ´¦Àí¸´ÔӵĶà±íÊý¾Ý¹ý³ÌÖУ¬¿ÉÒÔ¿¼ÂÇʹÓô˴¦Àí·½Ê½¡£
ÈôʹÓÃÀÖ¹Û²¢·¢·½Ê½£¬ÏµÍ³ÔÊÐí¶à¸ö¿Í»§¶Ëͬʱ´¦Àíͬһ¸öÊý¾Ý±í¡£Èç¹ûËù´¦ÀíµÄÊÇÊý¾Ý±íÖеIJ»Í¬¶ÔÏ󣬲Ù×÷¿ÉÒÔ˳ÀûµØ½øÐжø²»»áÏ໥ӰÏì¡£Èç¹ûËù´¦ÀíµÄÊÇÊý¾Ý±íÖеÄÏàͬ¶ÔÏ󣬿ÉÒÔ±£ÊØ´¦Àí£¬±£´æµÚÒ»´ÎÊäÈëµÄ¶ÔÏóÖµ£¬È»ºó°ÑÒýÆðÒì³£µÄÊý¾ÝÏÔʾÈÿͻ§½øÐжԱȡ£
×ܽá
²¢·¢»°ÌâÓëÏ̡߳¢½ø³ÌµÈÆäËû»°ÌâÓÐËù²»Í¬£¬Ëü²¢Ã»Óи´ÔÓµÄÀàºÍ·½·¨¡£´¦Àí²¢·¢À´À´È¥È¥¶¼ÊǼòµ¥µÄ¼¸ÐдúÂ룬ËüËùÖØÊÓµÄÊDz¢·¢Òì³£·¢ÉúºóËù´øÀ´µÄºó¹ûÓë´¦Àí·½Ê½¡£ÓëÖйú´«Í³µÄÌ«¼«ÏàËÆ£¬²¢·¢Ö»ÖØÆäÒ⣬²»ÖØÆäÕУ¬Ö»ÒªÉîÈëµØÁ˽âÆä¹ý³Ì£¬¿¼ÂÇÆä¿ÉÄÜ´øÀ´µÄÎÊÌâºó£¬Äã±ã¿ÉÒÔ¶ÔÆäÊÕ·¢×ÔÈç¡£
¶Ô²¢·¢µÄ´¦ÀíÓ¦¸ÃÕë¶ÔÌØ¶¨µÄÎÊÌ⣬·Ö±ð¶Ô´ý¡£µ½×îºóÄã¿ÉÄÜ·¢ÏÖ£¬ÔÀ´Î¢ÈíÔçÒÑΪÄã¶¨ÖÆºÃ´¦ÀíµÄ·½Ê½£¬¿ÉÄÜ
¡°»Øµ½Ôµã¡± ʲô¶¼²»×ö¾ÍÊÇ×îºÃµÄ´¦Àí·½Ê½¡£
Ï£Íû´ËÎÄÕ¶ÔÈôó¼ÒÓÐËù°ïÖú£¬»¶Ó¸÷λÌṩ±¦¹óÒâ¼û£¬Ö¸³öÎÄÖдæÔÚ´íÎó»ò©¶´¡£
|