Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Entity Framework ²¢·¢´¦ÀíÏê½â
 
×÷Õߣº·ç³¾ÀË×Ó À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ 2015-8-4
  4118  次浏览      31
 

ÒýÑÔ

ÔÚÈí¼þ¿ª·¢¹ý³ÌÖУ¬²¢·¢¿ØÖÆÊÇÈ·±£¼°Ê±¾ÀÕýÓɲ¢·¢²Ù×÷µ¼ÖµĴíÎóµÄÒ»ÖÖ»úÖÆ¡£´Ó 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¢·¢Òì³£·¢ÉúºóËù´øÀ´µÄºó¹ûÓë´¦Àí·½Ê½¡£ÓëÖйú´«Í³µÄÌ«¼«ÏàËÆ£¬²¢·¢Ö»ÖØÆäÒ⣬²»ÖØÆäÕУ¬Ö»ÒªÉîÈëµØÁ˽âÆä¹ý³Ì£¬¿¼ÂÇÆä¿ÉÄÜ´øÀ´µÄÎÊÌâºó£¬Äã±ã¿ÉÒÔ¶ÔÆäÊÕ·¢×ÔÈç¡£

¶Ô²¢·¢µÄ´¦ÀíÓ¦¸ÃÕë¶ÔÌØ¶¨µÄÎÊÌ⣬·Ö±ð¶Ô´ý¡£µ½×îºóÄã¿ÉÄÜ·¢ÏÖ£¬Ô­À´Î¢ÈíÔçÒÑΪÄã¶¨ÖÆºÃ´¦ÀíµÄ·½Ê½£¬¿ÉÄÜ ¡°»Øµ½Ô­µã¡± ʲô¶¼²»×ö¾ÍÊÇ×îºÃµÄ´¦Àí·½Ê½¡£

Ï£Íû´ËÎÄÕ¶ÔÈôó¼ÒÓÐËù°ïÖú£¬»¶Ó­¸÷λÌṩ±¦¹óÒâ¼û£¬Ö¸³öÎÄÖдæÔÚ´íÎó»ò©¶´¡£

   
4118 ´Îä¯ÀÀ       31
 
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

ʹÓÃdecj¼ò»¯Webǰ¶Ë¿ª·¢
Web¿ª·¢¿ò¼ÜÐγÉÖ®ÂÃ
¸üÓÐЧÂʵÄʹÓÃVisual Studio
MVP+WCF+Èý²ã½á¹¹´î½¨¿ò¼Ü
ASP.NETÔËÐлúÖÆÇ³Îö¡¾Í¼½â¡¿
±àд¸üºÃµÄC#´úÂë
10¸öVisual Studio¿ª·¢µ÷ÊÔ¼¼ÇÉ

.NET¿ò¼ÜÓë·Ö²¼Ê½Ó¦Óüܹ¹Éè¼Æ
.NET & WPF & WCFÓ¦Óÿª·¢
UML&.Net¼Ü¹¹Éè¼Æ
COM×é¼þ¿ª·¢
.NetÓ¦Óÿª·¢
InstallShield

ÈÕÕÕ¸Û .NET Framework & WCFÓ¦Óÿª·¢
Éñ»ªÐÅÏ¢ .NETµ¥Ôª²âÊÔ
±±¾© .NetÓ¦ÓÃÈí¼þϵͳ¼Ü¹¹
̨´ïµç×Ó .NET³ÌÐòÉè¼ÆÓ뿪·¢
ÈüÃÅÌú¿Ë C#Óë.NET¼Ü¹¹Éè¼Æ
¹ã¶«ºËµç .NetÓ¦ÓÃϵͳ¼Ü¹¹