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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Entity Framework Óë ÃæÏò¶ÔÏó
 
×÷ÕߣºIndream Luo À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ£º2015-10-10
  3771  次浏览      27
 

ÉϴβÅ˵Ҫ·ÖÏíÈ¥ÄêµÄÏîÄ¿£¬Õâ´ÎÒ»ÏÂ×Ó±»ÐµIJÆÎñϵͳºÄÁËÈý¸ö¶àÔ£¬ËùÒԾ͸ɴàÏÈ·ÖÏíÏÂÐÂϵͳÖеÄÄÚÈÝ¡£

×ÜÒªÓÐÒ»¸öµã¿ªÊ¼Õ¹¿ª½øÐзÖÏí£¬ËùÒԾʹÓEFÀ´½øÐÐÕ¹¿ª£¬·´ÕýEFÊǹᴩͷβµÄ¡£Èç¹û˳ÀûµÄ»°»òÐí»¹¿ÉÒÔÓС¶EF ºÍ ÒµÎñÂß¼­¡·¡¢¡¶EF ºÍ Web¡·¡¢¡¶EF ºÍ Сƻ¹û¡·......

±Ï¾¹ÕâÆªÎÄÕ²»½Ð×ö¡¶Pro EF¡·Ö®ÀàµÄ½²Ô­Àí£¬ÆäÄ¿µÄÊǽ²ÊöÔÚÏîÄ¿ÖжÔEFµÄÓ¦ÓúÍÀí½â£¬ËùÒÔº­¸Ç²»È«£¬¶à¶à°üº­¡£

ORM±ÈÈçEFµÄʹÓÃÓм¸Öؾ³½ç£¬ºÜ¶àÀ´Ëµ¸ú¿ò¼Ü±¾ÉíµÄÄÜÁ¦Óйأ¬×îºÃµÄÇé¿öÏÂÒ²²»¹ýÄÜÍ£ÁôÔÚÍÚ¾òÏÂORMµÄ¹¦ÄܶøÒÑ¡£ºÜ¶àÎÒ¼ûµ½µÄORMʹÓò»¹ýÊǽö½öΪÁËÌæ´úSQL£¬CRUDµÄ˼Ï벢ûÓÐʲô¸Ä±ä£¬ËùÓкܶàÏîÄ¿»¹ÓÐRepositoryÒ»²ã¡£

Êý¾Ý¿âÊÇCRUDµÄ£¬ÃæÏò¶ÔÏóÊÇ¡°·½·¨Óëʼþ¡±µÄ£¬¿öÇÒËüÃDZ¾Éí¾ÍÓС°×迹ʧÅ䡱£¬¾Í²»ÊÇÒ»¸öÖÖ×åµÄ¡£ÕâÀïÎÒ²¢²»Ïë˵Ã÷µ½µ×ÄĸöºÃ»òÕßÓ¦¸ÃÈçºÎ£¬ÎÒÖ»ÊÇÏëÔÚÏîÄ¿ÊÕβ½×¶Î·ÖÏíÒ»ÏÂÎÒÔÚ¡°¼ÙÈç¸üÃæÏò¶ÔÏó¡±µÄÒ»´Îʵ¼ù¡£

Õâ´ÎÏîÄ¿ÊǽÓÊÖÈ¥Äê²»³É¹¦µÄ²ÆÎñÏîÄ¿£¬×îÖÕ¾ö¶¨ÓÉÎÒÖØ×ö¡£·´Õý»ù±¾ÉÏÒ»¸öÈË´ÓÍ·µ½Î²£¬ÄÇÎҾ͡°·ÅËÁ¡±Ï´󵨵ØÈ«OOʽµØ½øÐС£Êý¾Ý×÷Ϊ¹á´©ÏîÄ¿ÕûÌåµÄÒ»·½Ã棬ÒÑEFΪ»ù´¡£¬×ÔȻռÁ˺ÜÖØÒ»²¿·Ö£¬ËùÒÔ´ÓEF½øÐÐÀ©Õ¹Ò²ÊDz»´íµÄÑ¡Ôñ¡£

µÚÒ»²¿·ÖBasic»á¼òµ¥µØ´ø¹ýһЩÎÒ¶ÔEFÏà¹Ø»ù´¡µÄ¡°ÈÏʶ¡±£¬ÈÏʶEFµÄÌø¹ý¾ÍºÃÁË£»Class²¿·ÖÌØµØ½»´úÒ»Ð©ÃæÏò¶ÔÏóµÄÓ÷¨£»Business¼òµ¥ËµÃ÷ÏÂÔÚÒµÎñÖеÄÓ¦Óá£

ÏîÄ¿ºÍʾÀýÖж¼²ÉÓÃModel First£¬»ùÓÚEF5¡¢VS 2012¡¢SQL Server 2012¡£Ê¾Àý»áÔÚʵ¼ÊÏîÄ¿ºÍDemoÖд©²åÒýÓá£

×îºó²»µÃ²»Ìáµ½µÄÊÇ£¬Entity FrameworkÖ»ÓÐÓëLinQÏà°é²ÅÄÜÈç´ËÓä¿ìµØÍæË££¬ËùÒÔÖм䴩²åµÄLinQ¾Í²»¶àÌáÁË¡£

Ò»¡¢»ù´¡

Entity Framework Model FirstÔÚ¿ª·¢¹ý³ÌÖÐÊʺÏÃô½ÝµÄ»ù´¡ÊÇ£ºÍ¼Ðλ¯µÄÉè¼ÆÆ÷¡¢Êý¾Ý¿âÓëÄ£Ð͵ĿìËÙͬ²½¡£

ͬ²½·½Ã棬ÓÉÓÚÎҵĴòËãÊÇ¡°¸üÃæÏò¶ÔÏó¡±£¬ËùÒÔͬ²½½öʹÓÃÓÃÄ£ÐÍÉú³ÉÊý¾Ý¿âµÄ·½Ê½¡£Ê×ÏÈÐèÒª´´½¨ÏîÄ¿¡¢ÔÚÏîÄ¿ÖÐÌí¼ÓADO.NET Entity Data Model¡¢ÔÚÊý¾Ý¿â·þÎñÆ÷Öд´½¨ÏàÓ¦µÄÊý¾Ý¿â¡£ÎªÁË·½±ãÇø·Ö£¬ÎÒʹÓÃÁËÏàͬµÄÃüÃû£º

ÔÚ´´½¨ºÃModelºó£¬ÔÚͼÐÎÉè¼Æ½çÃæÖУ¬ÓÒ¼üÈ»ºóÑ¡Ôñ½«Ä£ÐÍͬ²½µ½Êý¾Ý¿âÖУ¬¼´¿É´´½¨ÏàÓ¦µÄSQL£»ÔËÐиÃSQL£¬¼´¿ÉÔÚÏàÓ¦Êý¾Ý¿âÖд´½¨¶ÔÓ¦µÄ±íÓë¹ØÏµ£º

ÔÚÏîÄ¿´úÂë²ãÃæ£¬ÔÚÉú³ÉEntity ModelµÄͬʱ£¬»á´´½¨Ò»¸ö¼Ì³ÐÓëDbContextµÄÀà¡£¸ÃÀà³éÏóµØËµ£¬¶ÔÓ¦µÄÊÇÖ¸¶¨µÄÊý¾Ý¿â£¬ËùÓжÔÓÚÏà¹ØµÄÊý¾Ý¿âµÄ·ÃÎʶ¼¡°¾­¹ý¡±»òÕß¡°Í¨¹ý¡±¸ÃÀà¡£ÔÚºóÀ´µÄEF°æ±¾ÖУ¬Õâ¸öDbContextµÄÅÉÉúÀà»ù±¾É϶¼ÃüÃûΪ¡°Entity ModelÃû³Æ+Container¡±µÄÐÎʽ£¬ÎÒϰ¹ß³ÆÕâ¸öÀàµÄʵÀýΪentities£¬ÒòΪ´ÓǰµÄÃüÃû·½Ê½ÊÇ¡°Entity ModelÃû³Æ+Entities¡±£º

˳±ã¼òµ¥µØËµÃ÷ÏÂCRUDµÄ¼òµ¥ÊµÏÖ·½Ê½£º

public MyFirstEntity Create()
{
//´´½¨ÐµÄDbContext
var entities = new EntityFrameworkDemoContainer();
//´´½¨ÐµÄʵÌå
var newMyFirstEntity = new MyFirstEntity();
//½«Ð¶ÔÏó²åÈëµ½ÐòÁÐÖÐ
entities.MyFirstEntities.Add(newMyFirstEntity);
//Ö´ÐÐÊý¾Ý²Ù×÷
entities.SaveChanges();
//·µ»Ø×îд´½¨µÄʵÌå
return newMyFirstEntity;
}

public MyFirstEntity Retrieve(int id)
{
//´´½¨ÐµÄDbContext
var entities = new EntityFrameworkDemoContainer();
//²éÕÒµ½ÊµÌå
var myFirstEntity = entities.MyFirstEntities.First(entity => entity.Id == id);
//·µ»Ø²éÕÒµ½µÄʵÌå
return myFirstEntity;
}

public void Update(int id)
{
//´´½¨ÐµÄDbContext
var entities = new EntityFrameworkDemoContainer();
//²éÕÒµ½ÊµÌå
var myFirstEntity = entities.MyFirstEntities.First(entity => entity.Id == id);
//ÐÞ¸ÄʵÌå
/*´Ë´¦ÂÔÈ¥ÐÞ¸ÄʵÌå´úÂë*/
//±£´æÐÞ¸Ä
entities.SaveChanges();
}

public void Delete(int id)
{
//´´½¨ÐµÄDbContext
var entities = new EntityFrameworkDemoContainer();
//²éÕÒµ½ÊµÌå
var myFirstEntity = entities.MyFirstEntities.First(entity => entity.Id == id);
//ɾ³ýʵÌå
entities.MyFirstEntities.Remove(myFirstEntity);
//±£´æÐÞ¸Ä
entities.SaveChanges();
}

¶ÔÏóÓë±í

ÔÚÉè¼ÆÆ÷Öд´½¨ÏàÓ¦µÄEntity£¬¾Í»áÔÚÏîÄ¿Öд´½¨ÏàÓ¦µÄClass£¬Í¬²½µ½Êý¾Ý¿âºó£¬¾Í»á´´½¨ÏàÓ¦µÄTable¡£TableµÄÃû³Æ»áÊÇEntityµÄ¸´ÊýÐÎʽ£¬´ó²¿·ÖÇé¿öÏÂÓï·¨ÊÇûÓдíµÄ¡£

¶ÔÓ¦µØ£¬ÔÚÉÏÃæµÄCRUDʾÀýÖÐÒѾ­ËµÃ÷ÁËÈçºÎ·ÃÎÊÕâÕűíµÄÊý¾ÝÁË¡£

×Ö¶ÎÓëÊôÐÔ

ÔÚÉè¼ÆÆ÷ÖУ¬¿ÉÒÔΪָ¶¨µÄEntityÌí¼ÓÊôÐÔ£¬Ìí¼ÓÊôÐÔºó¿ÉÒÔͨ¹ýProperties½øÐÐÉè¼Æ¡£Í¬²½µ½Êý¾Ý¿âºó£¬¶ÔÓ¦µÄÊôÐÔ»áÉú³É¶ÔÓ¦µÄTable Column¡£µ±È»£¬ÔÚÏîÄ¿ÖУ¬Ò²»áÔÚÔ­ÓеÄÀàÉÏÌí¼ÓÏàÓ¦µÄÊôÐÔ¡£Ïà¹ØµÄÀàÐ͵Ä״̬»á×Ô¶¯Æ¥Åä¡£¿ÉÒÔ¿´µ½ÓÃÏàͬÑÕÉ«±ê¼ÇµÄ¶ÔÓ¦µÄ¶ÔÏóÔÚ²»Í¬·½ÃæµÄÌåÏÖ£¬±ÈÈçÀàÐÍ¡¢ÊôÐÔÃû³Æ¡¢¿É¿ÕÐÔ£¨Nullable£©¡£

ÒýÓÃÓë¹ØÏµ

ÔÚÕâÀÎÒ´´½¨Á˵ڶþ¸öʵÌ壬ȻºóÌí¼ÓÁËÓëµÚÒ»¸öʵÌåµÄ¹ØÁª¡£ÔÚÌí¼Ó¹ØÁªÖУ¬ÎÒÑ¡ÔñÁËÒ»¶Ô¶à£¬²¢ÇÒÔÚÉè¼ÆÊ±£¬Ê¹ÓÃÁËĬÈÏÉú³ÉµÄ¡°ÒýÓÃÃû¡±£¬ÏÈ¿´¿´½á¹ûÔÙ½²½â£º

¿ÉÒÔ¿´µ½£¬ÔÚÊý¾Ý¿â²ãÃæ£¬Ò²Éú³ÉÁËÏàÓ¦µÄÒ»¶Ô¶à¹ØÏµ¡£ÆäʵÏÖ·½·¨ÊÇͨ¹ý¡°¶à¡±µÄÄÇÕűíÌí¼ÓµÄÒ»¸öÖ¸Ïò¡°Ò»¡±±íÖ÷¼üµÄÍâ¼ü¶øÊµÏֵ쬻ù±¾»¹ºÜºÃÀí½â¡£

»Øµ½¶ÔÏó²ãÃæ£¬¿ÉÒÔ¿´µ½¡°Ò»¡±µÄÀàMyFirstEntityÖжà³öÁËÒ»¸öMySecondEntitesµÄ¼¯ºÏÊôÐÔ£¬Òª×¢ÒâÃüÃû»¹ÊÇ×Ô¶¯¸´ÊýµÄ¡£¶ÔÓ¦µÄMySecondEntityÀïÒ²ÓÐÒ»¸öµ¥Ò»µÄMyFirstEntityÊôÐÔ¡£

¼ÙÉèmyFirstEntityΪһ¸öMyFirstEntityµÄʵÀý£¬mySecondEntityΪһ¸öMySecondEntityµÄʵÀý¡£ÄÇô£¬ÔÚC#ÖУ¬·ÃÎÊmyFirstEntityÖйØÁªµÄËùÓÐMySecondEntityµÄ·½Ê½¼´Îª£º

myFirstEntity.MySecondEntities

ͬÀí£¬ÔÚmySecondEntityÖзÃÎÊÏà¹ØÁªµÄmyFirstEntityΪ£º

mySecondEntity.MyFirstEntity

ҪעÒâµÄÊÇ£¬ÔÚ¶ÔÏó²ãÃæµÄ¹ØÏµÖУ¬»¹ÓС°0..1¡±£¬¼´1¸ö»òÕß0¸ö£¬ÔÚÊý¾Ý¿âʵÏÖÖУ¬ÔòÊÇÒ»¸ö¿É¿ÕµÄÍâ¼ü¡£

×¢ÒâÎÒÔÚÌí¼Ó¹ØÏµµÄʱºò£¬²¢Ã»Óй´Ñ¡¡°Ìí¼ÓÍâ¼üÊôÐÔµ½...¡±£¬Õû¸öÏîÄ¿Öж¼Ã»ÓС£ÔÚÒÔÍùµÄ¾­ÑéÀÍâ¼üÈÝÒ×Èÿª·¢ÈËÔ±¡°Ïñ²Ù×÷¹ØÏµÊý¾Ý¿âÒ»Ñù²Ù×÷Êý¾Ý¡±£¬µ¼Ö´úÂëÏÝÈëÒ»ÖÖºÜÆæ¹ÖµÄÇéÐΡ£

ÔÚÕâÀ²»µÃ²»Ëµµ½ÃæÏò¶ÔÏóºÍ¹ØÏµÊý¾Ý¿âµÄ¡°¹ØÏµ¡±ÎÊÌâ¡£Ê×ÏȲåÈëÒ»¸öÊýѧʽ×Ó£º

ÓÃR(A, B)À´ÃèÊöʵÌ壨±í/ÀࣩAÓëʵÌåBµÄÊýÁ¿¹ØÏµ

Èç¹ûÒ»¸öA¶ÔÓ¦Ò»¸öB£¬ÔòR(A, B)Ϊ1

Èç¹ûÒ»¸öA¶ÔÓ¦¶à¸öB£¬ÔòR(A, B)Ϊn

Èç¹ûAÓëBûÓйØÏµ£¬ÔòR(A, B)Ϊ0

Èç¹ûR(A, B), R(B, C) > 0£¬ÄÇôR(A, C) = R(A, B) * R(A, C)

Èç¹ûÓÃ×ÔÈ»ÓïÑÔ¾ÙÀýÀ´Ëµ£¬ÄǾÍÊÇ£¬Èç¹ûÿ¸öAÓУ¨¹ØÁª£©Ò»¸öB£¬Ã¿¸öBÓУ¨¹ØÁª£©Ò»¸öC£¬ÄÇôÿ¸öAÓУ¨¹ØÁª£©Ò»¸öC¡£

ÔÚ˵µ½¾ßÌåÊÂÀýǰ£¬ÎÒÔÙ̽ÌÖÒ»ÏÂÊý¾Ý¿â·¶Ê½£¬Ï¸¾Í²»½²£¬Êý¾Ý¿â·¶Ê½µÄ×÷ÓþÍÊÇΪÁËʹµÃÊý¾ÝÈßÓà×îÉÙ£¬Õâô½²Ó¦¸ÃûʲôÆçÒå¡£

ÄÇôÎҵĽáÂÛ¾ÍÀ´ÁË£ºÊ¹ÓÃEF£¨»òÕßÀàËÆORM£©ÄÜʹµÃÊý¾Ý¿âÉè¼Æ¸üÈÝÒ×ʵÏÖ¸ü¸ß·¶Ê½¡£

¾Ù¸öÀý×Ó£¬Èç¹ûÿ¸öA¶ÔÓ¦Ò»¸öB£¬Ã¿¸öB¶ÔÓ¦Ò»¸öC£¬...£¬Ã¿¸öY¶ÔÓ¦Ò»¸öZ£»ÄÇô£¬Ã¿¸öA¶ÔÓ¦Ò»¸öZ¡£

Èç¹ûÎÒÓµÓÐÒ»¸öAµÄʵÀýa£¬ÎÒÐèÒª»ñÈ¡Æä¶ÔÓ¦µÄʵÀýz£¬ÄÇôӦ¸ÃÔõôʵÏÖ£¿

Èç¹ûÊÇÓÃSQL£¬ÄÇôÎÊÌâ¾Í±ä³É£º¡°Èç¹ûÎÒÓÐÒ»¸öAµÄÖ÷¼üID£¬ÈçºÎ»ñÈ¡Ïà¹ØµÄZµÄRow£¿¡±

¿ÉÄÜÊǸöÈ˲¢²»ÊìϤSQL£¬ËùÒÔÔÚÎÒÓÐÏÞµÄSQL֪ʶ¿´À´£¬ÎÒÐèҪЩһ¶ÎºÜ³¤ºÜ³¤ºÜ³¤ºÜ³¤ºÜ³¤ºÜ³¤ºÜ³¤ºÜ³¤µÄSQL²ÅÄܲ鵽ÎÒÒªµÄÊý¾Ý¡£ËùÒÔÒ»°ã³öÏÖÕâÖÖÇé¿ö£¬Îһᡰ*Ëû*µÄ·¶Ê½£¡¡±È»ºóÖ±½ÓÀ­Ò»ÌõAÓëZµÄ¹ØÁª£¬ËäÈ»²»½öû×ñÑ­·¶Ê½£¬¶øÇÒÁ¬¡°»·¡±¶¼²úÉúÁË¡£

Èç¹ûÔÚEF£¬Õâô¼òµ¥µØÐ´¾Í¿ÉÒÔ·ÃÎʵ½ÁË£º

a.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z;

µ±È»£¬Êµ¼ÊÉÏ»¹ÊÇÖ´ÐÐÁËÒ»¶Î¿ÉŵÄSQL£¬µ«ÊÇÒòΪÓÃÆðÀ´¼òµ¥ÁË£¬ËùÒÔ¸ü¼Ó²»ÐèÒªËæÒâ´òÆÆ·¶Ê½ÁË¡£

Èç¹ûÎÒ¾­³£ÐèÒª´ÓA·ÃÎÊZ£¬ÐèÒª£º

a.Z;

ÄÇô¾ÍÓ¦¸Ã²Î¿¼ºóÃæµÄ¡°À©Õ¹×ֶΡ±²¿·ÖÁË¡£

¸´ÔÓÒ»µã£¬Èç¹ûR(A, B) = 1, R(B, C) = n£¬ÄÇô¶ÔÓ¦R(A, C)Ϊnû´í£»Èç¹ûR(A, B), R(B, C) = n£¬ÄÇôR(A, C) = n ^2£¬ÔÚC#ÖзÃÎÊAµÄC¼¯ºÏµ±È»ÓÃLinQµÄSelectManyÁË£»Èç¹û´ÓAµ½Z¶¼ÄÇô³É±¶ÓÖÐèÒª·ÃÎÊ£¬ÓÖ²»Ïëÿ´ÎдÄÇô¶àSelectManyǶÌ×ÄØ£¿ÄǾÍÖ»ºÃ²Î¿¼ºóÃæ¡°À©Õ¹×ֶΡ±²¿·ÖÁË¡£

ÔÚ¹ØÏµÊý¾Ý¿âÖУ¬¡°¹ØÏµ¡±½ö½ö°üº¬×Å1¶Ôn£¬n¶ÔnΪÁ½¸ö1¶Ôn×éºÏ£»¶øÔÚÃæÏò¶ÔÏóÀÓÉÓÚ¶ÔÏó¸ü¶àµØ½Ó½üʹÓÃ×ÔÈ»ÓïÑԵķ½Ê½ÃèÊö¡°¹ØÏµ¡±£¬Æä¡°¹ØÏµ¡±¾Í±äµÃ¸´ÔÓ¶ø²»ºÃÀí½âÁË¡£¸ü¶àµÄÄÚÈÝ£¬»¹ÐèÒª½²ÊöÍêÏÂÃæ¡°¼Ì³ÐÓë¹ØÏµ¡±²ÅÄܱȽϺÃÕ¹¿ª¡£

ÁíÍâ¿ÉÒÔ˵Ã÷϶ԹØÏµ½øÐи´ÖÆ£¬Ò²¾ÍÊÇÌí¼Ó¹ØÁª£¬¿ÉÒÔ¼òµ¥µØ½øÐжÔÏó¸´ÖÆ£¬¶ø²»ÐèÒª´¥¶¯µ½Íâ¼ü£º

myFirstEntity.MySecondEntites.Add(newMySecondEntity);

ÕâÀïʾ·¶µÄÊÇÒ»¶Ô¶àµÄ¹ØÏµ£¬¶øÒ»¶ÔÒ»µÄÇé¿öÏÂÖ»ÐèÒªÖ±½Ó¸³Öµ¼´¿É¡£

¶þ¡¢Àà

ËäÈ»×÷ΪORM£¬±ØÈ»ÓÐÒ»°ë¹ØÓÚ¹ØÏµÊý¾Ý¿â£¬ÁíÒ»°ë¹ØÓÚÃæÏò¶ÔÏ󣬶øÎÒÈ·°Ñ¹ØÓÚ¹ØÏµÊý¾Ý¿âµÄ²¿·Ö·Åµ½ÁË¡°»ù´¡¡±¡£ÒòΪ×ÜÌåÀ´Ëµ£¬ÎÒ¾õµÃORMµÄ·¢Õ¹ÊÇÑØ×Å¡°SQL=>Data Framework(ÈçADO.NET)=>OO¡±µÄÇ÷ÊÆÏÂÈ¥µÄ£¬ËùÒÔ°ÑOO²¿·Ö·Åµ½ÁË¡°¸ü¸ß¼¶±ð¡±µÄµØ·½¡£

ÁíÍ⣬ÔÚÕâÖÖ»®·ÖÇé¿öÏ£¬¿ÉÒÔ´óÖµØÀí½âΪÎÒ°Ñ¡°´æ´¢ÔÚÊý¾Ý¿âÖеġ±·Åµ½ÁË»ù´¡£¬°Ñ¡°ÁíÍâ±íÏÖÔÚÃæÏò¶ÔÏóÖеġ±·Åµ½Á˺óÃæ¡£

¼Ì³ÐÓë¹ØÏµ

¼ÈÈ»ÊÇÃæÏò¶ÔÏó£¬Äǵ±È»ÒªÓÐ×î»ù´¡µÄ¹ØÏµ¡ª¡ª¼Ì³Ð¡£

ÔÚEFÖУ¬¿ÉÒÔÉè¼ÆÁ½¸öÀàΪ»ùÀà×ÓÀà¹ØÏµ£¬ÉõÖÁÒ»¸ö»ùÀà¶à¸ö×ÓÀà¡£

ͬÑùÔÚÉè¼ÆÆ÷ÖÐÌí¼Ó¼Ì³Ð¼´¿É£¬¿ÉÒÔ´´½¨Í길Àà×ÓÀàºóÔÙ¡°Ìí¼Ó¼Ì³Ð¡±£¬»òÕßÖ±½ÓÔÚ´´½¨×ÓÀàµÄʱºòÑ¡Ôñ¸¸Àࣺ

ÔÚÉè¼ÆÊ±£¬ÎÒÃÇ¡°´´½¨ÁËÒ»¸ö»ùÀàºÍ¼Ì³ÐÓë¸Ã»ùÀàµÄ×ÓÀࡱ£¬¶øÔÚÊý¾Ý¿âÖÐÔòÊÇ¡°´´½¨ÁËÒ»¸ö±íÒÔ¼°Ò»ÕŹØÏµÓëÆä1¶Ô1/0µÄ´Ó±í¡±¡£ÔÚÊý¾Ý¿â²ãÃæ£¬ÕâÁ½ÕÅ±í¹²ÓÃID£¬µ±È»ÁË£¬ÒòΪËûÃÇÊÇÒ»Ò»¶ÔÓ¦µÄ¹ØÏµ£¬Í¬ÖµµÄÖ÷¼üºÍÖ±¹Û£»ÔÚÀà²ãÃæ£¬¿ÉÒÔ¿´µ½Ö»ÓÐBase²ÅÓÐID£¬SubÔÚ¶¨ÒåÉÏûÓУ¬Êµ¼ÊÉÏ¡°¼Ì³ÐÁË¡±BaseµÄID£¬Ò²ÓµÓÐÒ»¸öID¡£

ҪעÒâµÄÊÇ£¬ÔÚDbContext´¦£¬²¢Ã»ÓвúÉúSubµÄDbSetÐòÁÐÊôÐÔ£¬ÐèҪͨ¹ýBaseÀ´²ÅÄÜ·ÃÎʵõ½Sub£¬Ê¹ÓÃOfType<TSub>()£º

var subs = entities.Bases.OfType<Sub>();

²åÈëSubʵÀý/ÐеÄʱºò£¬Ò²ÐèҪͨ¹ýBases£º

entites.Bases.Add(new Sub());
entities.SaveChanges();

·ÃÎÊÐÔ

ÔÚ±íÀïÃæ¶¼²»¹ýÊÇÊý¾Ý×ֶΣ¬¶øÔÚÃæÏò¶ÔÏ󣨻ù±¾ÉÏÖ¸´úC#Ò»Àà´«Í³ÃæÏò¶ÔÏóÓïÑÔ£©ÖУ¬ÊÇÓС°·ÃÎÊÐÔ¡±Ò»Ëµ¡£

ÔÚÉÏÃæµÄ»ù´¡ÉÏ£¬ÎÒ¿ÉÒÔ°Ñ»ùÀàÉèÖÃΪ³éÏóÀ࣬°Ñ×Ö¶ÎÉèÖ÷ÃÎÊÐÔ£¨public/protected/privite/internal£©£¬ÓÒ¼üÏà¹ØµÄʵÌå/×ֶΣ¬Ñ¡ÔñÊôÐÔ£¨Properties£©£º

¶øÔÚÊý¾Ý¿â²¿·Ö£¬ÔòÖ»ÊDZÈÉÏÃæ¶àÌí¼ÓÁËÒ»¸öSubPropertyµÄColumn¶øÒÑ¡£ÓÃÏà¹Ø·ÃÎÊÐеķ½·¨£¬¿ÉÒԺܺõØÔÚÓ¦Óò㱣»¤Êý¾ÝµÄÂß¼­°²È«ÐÔ¡£

³éÏóÀà±£Ö¤ÁËÎÞ·¨ÔÚÈÆ¹ý×ÓÀࣨ²»²åÈë±íBases_SubsÊý¾Ý£©µÄÇé¿öÏ´´½¨»ùÀà¶ÔÏ󣨲åÈëBasesÊý¾Ý£©£¬±£Ö¤ÁËÊý¾ÝÉÏµÄÆ¥Åä¶È£»¶ø×ֶηÃÎÊÐÐÔò¿ØÖÆÁ˵ĶÁд¡£

À©Õ¹×Ö¶Î

²»Òª±»Ð¡±êÌâÃÔ»óÁË£¬¸ú¡°C#À©Õ¹·½·¨¡±Ã»ÓаëëǮ¹ØÏµ£¬Ò²²»ÊÇͬÑù²ãÃæµÄÊÂÎï¡£ÕâÀïÖ¸µÄÊÇ£¬ÔÚ²»Ôö¼ÓÊý¾Ý¿â×ֶεÄÇé¿öÏÂÀ©³äÀà²ãÃæµÄ×ֶΡ£

ʵÏÖÀ©Õ¹×ֶεĻù´¡£¬ÊÇËùÓеÄÄ£°å×Ô¶¨Òå´´½¨Àà¶¼ÊÇpartialµÄ¡£ÒòΪÿ´Î¸ü¸ÄÄ£°å£¬ËùÓÐÔÚ¸ÃData ModelÎļþϵÄÀ࣬°üÀ¨DbContext¶¼»á´ÓT4Ä£°åÖØÐÂÉú³ÉÒ»´Î£¬ËùÒÔÄãÎÞ·¨ÔÚÔ­ÓеÄÀà»ù´¡ÉϽøÐÐÈκÎÐ޸ģ¬ÄÇôĬÈÏÀàΪpartialÔòÓÈÎªÖØÒª¡£

Ö»Òª´´½¨Ò»¸öÀ࣬¶¨ÒåΪÉÏÃæBaseµÄpartialÀ࣬²¢Ìí¼ÓÒ»¸öExtendProperty×ֶΣ¬Éú³É±íºóÓë֮ǰ²¢Ã»ÓÐÊ²Ã´Çø±ð£¬×Ô¶¨ÒåÀ©Õ¹µÄ×ֶβ¢²»»áÉú³Éµ½±íÉÏ£º

È»ºó£¬ÔÚ¿ÕÊý¾Ý¿âµÄ³¡¾°ÏÂÔËÐÐÁËÏÂÃæÕâ¶Î´úÂ룬¿ÉÒÔ¿´µ½µ±Ê±WatchµÄ½á¹û£¨ÎÒÒѾ­°ÑSubPropertyµÄ·ÃÎÊÐԸĻØÁË¿Éд£©£º

È»ºóÔÚÔËÐÐÒ»´ÎÏÂÃæµÄ±È¶Ô´úÂ룺

¿ÉÒÔ¿´µ½Á½´Î½á¹û½ØÈ»²»Í¬£¬µÚ¶þ´ÎµÄExtendProperty×Ö¶ÎΪ¿Õ¡£ÒòΪµÚÒ»´Î»ñÈ¡µÄÊÇÒ»¿ªÊ¼²åÈëBaseÁбíµÄ¶ÔÏ󣬻º´æÁËÆðÀ´£¬¶øµÚ¶þ´ÎÊÇÖØÐÂÖØÊý¾Ý¿âÖжÁÈ¡µÄ¶ÔÏó£¬Êý¾Ý¿âÖв¢Ã»ÓиÃ×ֶΣ¬¶øÒ»¿ªÊ¼µÄ»º´æÖÐÓУ¬ËùÒÔ²úÉúÁËÕâÏî²îÒì¡£

ͬʱÎÒÃÇ¿ÉÒԲο¼Êý¾Ý¿âÖеÄÊý¾Ý£º

ͬʱҲ¿ÉÒÔ×¢Òâµ½£¬Bases_Sub±íµÄÖ÷¼üÊǿɶÁдµÄ£¬¶øBases±íµÄÖ÷¼üÊÇ×ÔÔöµÄ¡£Ò²¾ÍÊÇ˵Bases_Sub±íµÄÖ÷¼üÊÇͬ²½×ÔBases±í¶ÔÓ¦µÄÌõÄ¿¡£

ͨ¹ýÀ©Õ¹×ֶΣ¬ÎÒÃÇ¿ÉÒԺܺõØÈúܶàÖØÓÃÐԸߵķÃÎÊ·½Ê½±»¡°ÓÅÑŵء±·â×°ÆðÀ´£¬±ÈÈçÏÂÃæ¸ú/×Ó½Úµã/Ëï½ÚµãµÄÀý×Ó£º

ÔÚÕâÀÎÒ½¨ÒéÁбíÖо¡Á¿·µ»ØLinQ±í´ïʽֵ£¬¶ø¾¡Á¿²»·µ»ØÈκΰüº¬ÊµÀý»¯ÐÐΪµÄÐòÁУ¬ÒÔ½øÐÐÐÔÄܱ£»¤¡£

²»Ó¦ËæÒâʹÓÃÀ©Õ¹×Ö¶Î×÷ΪLinQ²éѯÌõ¼þ£¬ÒòΪÔÚÊý¾Ý¿âÖв»´æÔÚµÄ×Ö¶ÎÊÆ±Ø»áÔì³ÉÈ«¼¯ÎÞË÷ÒýµÄ±éÀú¡£

ÖÁÓÚ¼ÆËã³öµÄÀ©Õ¹µÄ×ֶΣ¬ÎÒ½¨Ò龡Á¿Ê¹Óûº´æ£¬¶ø²»Ã¿´Î¶¼½øÐмÆËã¡£

¼Ì³ÐÓëÔ¼Êø

ÓÐÁËÉÏÃæµÄµÄ»ù´¡ºÍÀ©Õ¹×ֶΣ¬¾Í¿ÉÒÔ½øÐÐһЩ¡°¶à̬¡±Ò»µãµÄÐÐΪ¡£

¼ÌÐøÉÏÃæµÄÀý×Ó£¬ÔÚ»ùÀàÉÏÌí¼ÓÒ»¸ö³éÏó·½·¨£¬È»ºó¡°ÆÈʹ¡±×ÓÀà±ØÐëʵÏָ÷½·¨£º

ÔÚÕâÀïҪעÒâµÄÊÇBase±¾Éí¾ÍÊÇÐéÀ࣬µ«ÔÚpartialÀï²»ÐèÒªÖØ¸´ÉùÃ÷£¬Ð´ÉÏÒ²ÎÞ·Á¡£

¸úÉÏÃæµÄÀ©Õ¹³öÀ´µÄ×Ö¶ÎÒ»Ñù£¬ÔÚ±íÖж¼²»»á²úÉú×ֶΡ£

Èý¡¢ÒµÎñ

ÓÐÁËÉÏÃæµÄ½¨Ä££¬Ö®ºó¾ÍÊÇÈçºÎʹÓýøÐÐÒµÎñ²Ù×÷µÄÎÊÌâÁË¡£

ÔÚÒ»´ÎEFµÄÊý¾Ý²Ù×÷ÖУ¬×ÜÌåÉÏÊǰüº¬ÏÂÃæËIJ¿·Ö£º

н¨DbContext

²Ù×÷DbContextʵÀý»ñÈ¡Êý¾Ý

¶ÔÊý¾Ý½øÐжÁд

ͨ¹ýDbContext±£´æÊý¾ÝÐÞ¸Ä

×îºóÒ»²½ÔÚд²Ù×÷µÄʱºò²Å»á·¢Éú/ʹÓá£

ÆäÖÐҪעÒâµÄÊÇ£¬ËùÓвÙ×÷¶¼ÊÇÎ§ÈÆÍ¬Ò»¸öDbContextʵÀý½øÐеġ£

Ê×ÏÈ¿´¿´ÏÂÃæ´úÂ룬firstBaseºÍfirstBase2µÄÖµÈçͬÉÏÃæËùÉ趨£¬ÏÔ¶øÒ×¼û£º

ÔÙÍùÏÂÔËÐвÅÊÇÎÒÏë˵µÄÖØµã£º

¿ÉÒÔ¿´µ½£¬¼´Ê¹»ñÈ¡¶ÔÏóÔÚ±£´æ¶ÔÏóÖ®ºó£¬´æÔÚÃ÷ÏÔµÄÏÈдºó¶ÁµÄ¹ØÏµ£¬²»Í¬DbContext£¨ÎÄÖеÄentitiesºÍentites2£©¶ÔÏóÈ¡³öµÄÊý¾ÝËùÔÚÀúÊ·½×¶ÎÒ²²»Ò»Ö¡£

Ò²¾ÍÊÇ˵£¬Ò»µ©Ò»¸öDbContext»ñÈ¡¹ýij¸öÊý¾ÝÖ®ºó£¬¾Í»á²úÉúÊý¾Ý»º´æ£¬¶ø¸Ã»º´æµÄ×÷ÓÃÓòÔÚÓÚ¸ÃDbContextÉÏ¡£

ͬÑùµÄµÀÀí¿ÉÒÔÀ©³äµ½£º¶Ôͬһ¸öDbContext»ñÈ¡µ½µÄ¶ÔÏó½øÐÐÐ޸ģ¬Ö»ÄÜͨ¹ý¸ÃDbContext½øÐб£´æÐ޸ġ£

ÌØ±ðÊÇ»¹ÒªÀ©³äµ½£ºÖ»ÓÐÀ´×Ôͬһ¸öDbContextµÄ¶ÔÏó²Å¿ÉÒÔ½øÐйØÁª²¢ÇÒ±£´æ£¬·ñÔòÔÚ±£´æµÄʱºò»á·¢ÉúÒì³£¡£

ÕýÒòÈç´Ë£¬²Å»á²úÉúÏÂÃæµÄ¡°Ð­×÷ÓëÊÂÎñ¡±µÄÎÊÌ⣬ҲÊÇÕâÒ»½ÚµÄÈý¸öС½ÚÑÜÉúÔ´¡£

ʵÌåÓëÀ͹¤

ʲôÊÇÃæÏò¶ÔÏóµÄ¹¤×÷³¡¾°£¿ÎÒ¿´µ½Ó¡Ïó×îÉî¿ÌµÄ½âÊ;ÓÈ»ÊÇÀ´×ÔiOS¿ª·¢µÄ¹Ù·½ÈëÃŽ̳̣¬´óÖµÄÄÚÈݾÍÊÇ˵£¬¡°Äã¿ÉÒÔÈÏΪÊÇһȺ´æÔڵĶÔÏó»¥ÏàЭ×÷²¢Íê³É¹¤×÷¡£¡±·­²»³öÀ´ÁË£¬²»¹ý´óÖÂÈç´Ë¡£

ÔÚÕâÀïÎÒ²¢²»ÏëÍêÈ«¡°µß¸²¡±´¿²Ö´¢Ä£Ê½£¬Ö»ÊÇCRUDµØ¹¤×÷ÈÃÎÒ¾õµÃºÜ±ðŤ£¬µ±·½·¨×ã¹»¶àµÄʱºòÄÑÒÔ¶ÔÒµÎñ½øÐÐÖØÓõȵȡ£¶øÔÚʹÓÃEFµÄʱºòÎÒÒ²²»ÔÙдһ¸ö°üº¬RepositoryµÄ²ã£¬ÒòΪÎÒ¾õµÃºÜ¶àÓ࣬ÁíÒ»¸ö¾ÍÊÇÎÒÏ£Íû¾¡Á¿µØ¼õÉÙ²ã´Î£¬ÒÔ¼ò»¯ÏµÍ³¸´ÔÓ¶È¡£

ÁíÍâժ¼DbContextµÄ×¢Ê͵ĵÚÒ»¶Î»°£¬»òÐí±È½ÏÓвο¼¼ÛÖµ£º

ÉÏÃæËµµ½£¬Ò»¸öDbContextʵÀý¡°ÒѾ­ÊÇ¡±Ò»¸ö¹¤×÷µ¥ÔªºÍ²Ö´¢Ä£Ê½µÄ»ìºÏ¡£ÕâÒ²ºÜÈÝÒ×Àí½â£¬ÒòΪһ¸öDbContextʵÀýÒѾ­°üº¬ÁËCRUDÈ«¹¦ÄÜ¡£²»¹ýÕâ¸öʵÀýÈçͬҵÎñµÄÐèÇóÒ»Ñù£¬ËüÊÇÍêÕûµÄ£¬Ò²ÊÇ¡°²Ðȱ¡±µÄ¡£Èç¹ûÖ»CRUDÄÇôÿ´ÎÒµÎñ¾ÍÊÇ£ºÑ¡È¡Êý¾Ý=¡·¸üÐÂÊý¾Ý=¡·³Ö¾Ã»¯¡£¶øÊý¾ÝÖ»ÊÇϵͳÔËÐÐʱµÄÒµÎñ״ֵ̬£¬¶ø²»ÊÇϵͳ±¾Éí¡£ÏµÍ³µÄÄ¿µÄÊÇΪÁËʵÏÖÒµÎñ¶ø´æÔڵ쬶ø²»ÊdzÖÓÐÒµÎñµÄÊý¾Ý¡£

»Øµ½ÕâÀ¼´Ê±DbContext°üº¬ÁËCRUD£¬ËüҲûÓкܺõرí´ï³öÒµÎñ¡£¾ÙÀý˵£¬Óû§Ìá½»Ò»ÕÅÉêÇëµ¥£¬Èç¹ûÎÒÃǽ«Æä½âÊÍΪ¡°Óû§ÉêÇëXXX¡±£¬ÄÇôÎÒÃÇÏ£Íû¼ûµ½´úÂëÖбíÏÖ³öÀ´µÄ²»ÊÇ£º

entities.Applications.Add(new Application
{
Title = xxx,
Balance = xxx
});
entities.SaveChanges();

¶øÊÇ£º

applicationService.Apply(title, balance);

ÏÂÕß²»¹ýÊÇÉÏÕßµÄÒ»¸ö·â×°£¬µ«ÊÇÈ´ÓÖ²»Ò»ÑùµÄÒâÒå¡£ÎÒÃÇʹÓÃOOÊÇΪÁËÈôúÂë¸üÌù½üÏÖʵ£¬¶øÈô´Ôì³öµÄϵͳ¸ü¼Ó·ûºÏÏÖʵҵÎñÐèÇó¡£Ò²¾ÍÊÇֻʹÓÃDbContextÖ»ÄÜÃèÊö¶ÔÊý¾ÝµÄ²Ù×÷£¬È´ÎÞ·¨ÃèÊöÒµÎñ£¬ËùÒÔÎÒÃÇÐèÒªÒ»¸öÒµÎñ²ã¡£

ÃèÊöÒµÎñ¿ÉÒÔÓкܶàÖÖÉõÖÁÎÞÊýÖÖ½¨Ä££¬ÒòΪÏÖʵÖÐÈË¿´ÎÊÌâÓкܶàÖֽǶȣ¬±ÈÈçͬΪÉêÇëµ¥ÒµÎñ£¬Ò²¿ÉÒÔÕâôÀí½â£º

user.ApplyBalance(title, balance);

¡°ÈÃÓû§È¥ÉêÇ롱£¬¿´ËÆÒ²Ã»´í¡£ÉõÖÁÔÚ½¨Ä£ÖпÉÒÔÓúܶà¿äÕŵġ¢Ñ¤ÀöµÄÉè¼ÆÄ£Ê½£¬µ«ÄÇÈ´ÊÇ×îÔã¸âµÄÉè¼ÆÄ£Ê½£¬ÒòΪģʽ̫¶àÁË¡¢ÎÞ·¨Î¬»¤¡¢ÀË·Ñ´úÂëµÈµÈ¡£

ÎÒÐèÒªÒ»¸öÉè¼ÆµÄ·½Ê½£¬ÈÃ×ÜÌå±£³ÖÒ»Ö£¬Í¬Ê±Ò×ÓÚÀí½â¡£½è¼øDDD£¬ÎÒ°ÑÔÚÒµÎñÖдæÔڵĶÔÏó»®·Ö³ÉÁËÁ½¸ö½ÇÉ«£ºÊµÌåÓëÀ͹¤¡£

ʵÌåÖ¸´úµÄÊÇÊý¾Ý¶ÔÏ󣬶øÀ͹¤ÔòÊǹÜÀí¡¢²Ù×÷¡¢¼Ó¹¤Êý¾Ý¶ÔÏóµÄ¹¤×÷Õß¡£¡°ÊµÌ塱´ó¶àÊýÇé¿öϾÍÊÇÒ»¸ö¶¨ÒåºÃµÄEF¶ÔÏ󣬱Ͼ¹ÎÒʹÓÃEF×÷ΪÖ÷ÒªµÄÊý¾Ý²Ù×÷·½Ê½¡£

ÕâÓ봫ͳµÄÈý²ã¼Ü¹¹ºÜÏàËÆ£¬»òÐíÊÇÊâ;ͬ¹é¡£ÎÒÔÚÀ͹¤Ê¹Óõĺó׺Ϊ¡°Manager¡±£¬»òÕßÉÙÊýÇé¿öΪÁËϸ»¯£¬Í¬Ñù»áʹÓù¤×÷ÕßµÄÃüÃû·½Ê½£¬±ÈÈ磺Helper¡¢Provider¡¢Worker......ÖØÒªµÄÊÇ£¬ÎÒ°ÑËüÃdzéÏó³ÉÁËÒ»¸öÏÔʾ´æÔÚµÄÔËÐлúÆ÷»òÕßÍŶӣ¬ÓÐ×ÅÏñ¹¤³ÌÔËÐÐÒ»ÑùµÄ´ÓÊô¹ØÏµ¡¢ºÏ×÷¹ØÏµ¡£

Èç¹ûÒªÓиöÌùÇеļòÊö£¬ÄǾÍÊÇ£ºÀ͹¤ÊÇÓÐÖ÷¶¯ÐÔµÄÓÐÉúÃüµÄ£¬ÊµÌåÔòÊÇÀ͹¤ÃÇÀÍ×÷ÖеIJÙ×÷¶ÔÏóºÍ²ú³ö£¬Í¬Ê±Ò²²»ÅųýÒ»¸öÁìÓòµÄÀ͹¤ºÍʵÌåͬʱ´æÔÚ£¬±ÈÈçÓû§£¨User£©ºÍ¹ÜÀíÓû§µÄÀ͹¤£¨UserManager£©¡£

Ö°ÔðÓë·â±Õ

ÎÒÏàÐÅÿ¸öÀ͹¤µÄÖ°Ôð¶¼Ó¦¸ÃÊǵ¥Ò»µÄ¡¢·â±ÕµÄ£¬ËùÒÔ½«ËùÓÐÀ͹¤¶¼Éè¼Æ³ÉÖ°Ôðµ¥Ò»·â±Õ¡£¶øÊµÏÖµÄÒÀ¾Ý±ãÊÇÒ»¿ªÊ¼µÄÐèÇóÎĵµ£º

×ó±ßÊÇÎĵµÖеĽṹ£¬ÓÒ±ßÊÇ´úÂëÖеĽṹ£¬»ù±¾ÉÏÄÜÓëÎĵµÒ»Ò»¶ÔÓ¦¡£ÊµÏÖµÄÀàµÄÃèÊöÒ²ÊǾ¡Á¿ÓïÒ廯£¬ÕâÑù×öµÄÄ¿µÄÊÇΪÁËÌùºÏÐèÇ󣬶øÇÒ¼õÉÙ´úÂëÓëÐèÇó¼äµÄ×è¸ô£¬ÈôúÂë¸üÒ×ά»¤¡£ÕâÀïÎÒÃÇ»¹Êǽ²EFµÄÎÄÕ£¬Ëù¾Í²»¶à×öÀ©Õ¹ÁË¡£

´ÖË×µØËµ£¬¿ÉÒÔÀí½âΪ£¬¡º»ãÂÊManager¡»¾ÍÖ»¹ÜÀí»ãÂÊ£¬¶ø¡ºÉêÇëµ¥Manager¡»¾ÍÖ»¹ÜÀíÉêÇëµ¥¡£

À͹¤ÃǵĹØÏµÒ²¼òµ¥µØ»®·ÖΪÁ½ÖÖ£º

ÉÏϼ¶¡ª¡ªAÀ͹¤ÎªBÀ͹¤µÄÉϼ¶£¬ËùÒÔAÀϹ«°üº¬£¨has a£©B

Э×÷¡ª¡ªAÀ͹¤ºÍBÀ͹¤ÔÚijЩҵÎñÖÐÓкÏ×÷¹ØÏµ£¬AÒýÓã¨depend on£©B

µ±È»£¬ÆäÖеÄȱµãÒ²¾ÍÊÇÎÞ·¨½øÐÐÑ­»·ÒÀÀµ¡£

ÕâÀïÓÐÒ»¸ö»ÒÉ«µØ´øÒª»®Çå½çÏÞ£¬Ò²¾ÍÊÇ»ñÈ¡¹ØÁªÊý¾ÝµÄÎÊÌâ¡£

¼ÙÈçÄãÓµÓÐAÀàµÄʵÌåaºÍÀϹ«AManager£¬AÓëBÀàÓйØÏµ£¬ÄÇôӦ¸ÃÖ±½Óͨ¹ýa»ñÈ¡Ïà¹ØµÄb£¬¼´ b = a.B; £¬¶ø²»ÔÙͨ¹ýAManager»ñÈ¡¡£ÒòΪÉè¼ÆÖÐÈÏΪ£¬ËùÓÐÓëAÏà¹ØµÄʵÌ壬¼´AËøÓµÓеġ°¹ØÏµ¡±£¬¶¼Ó¦¸ÃÊÇAµÄÌØÐÔ/ÊôÐÔ£¬ÊÇAµÄÒ»²¿·Ö¡£

ºóÃæ»á½²µ½EntityµÄÉè¼ÆÄ£Ê½ÒÔ´ï³ÉÏà¹ØÈÎÎñ¡£

Э×÷ÓëÊÂÎñ

ÉÏÃæ»òÐíÒѾ­·¢ÏÖÒ»¸öì¶ÜÁË£ºEFËùÓÐÔ­×Ó»¯µÄ²Ù×÷¶¼ÒÀÀµÓÚµ¥Ò»µÄDbContextʵÀý£¬Èç¹ûÎÒ°ÑÖ¸Ôð²ð·Ö²¢·â±ÕÆðÀ´£¬ÄÇôËûÃǾͱØÐë¸÷×ÔʹÓÃ×Ô¼ºµÄDbContext¶ÔÏ󣬶øÎÞ·¨¹²Í¬´¦ÀíÊÂÎñ¡£

ÒÔϽâ¾ö·½°¸¿ÉÒÔ¼òµ¥·ñ¾ö£º

µ¥ÀýDbContext¡ª¡ªÎÞ·¨ÊµÏÖÒµÎñ¸ôÀë

ËùÓвÙ×÷¶¼´øÒ»¸öDbContext²ÎÊý¡ª¡ªÐ´ËÀÎÒÒ²

¶øÎÒÄÜÏëµ½µÄ×îÓÅÑŵĽâ¾ö·½°¸¾ÍÊÇ£ºÔÚÐèÒª¹²Í¬Ö´ÐÐÊÂÎñµÄʱºò×¢ÈëDbContext²¢£¬²¢ÇÒÓÃÊÂÎñ½øÐаü¹ü¡£

Ê×ÏÈ£¬ÔÚÿ¸öÀ͹¤¶¼ÒÀÀµÓÚÒ»¸öDbContextµÄÇé¿öÏ£¬ÎÒдÁËÒ»¸ö¹«¹²½Ó¿ÚÓë»ùÀà·Ö±ðΪ£º

/// <summary>
2 /// ÒÀÀµÓÚEntity Framework×öÊý¾Ý´æ´¢µÄ·½·¨µÄÀàµÄ½Ó¿Ú
3 /// °üº¬Í¬²½Entity Framework DbContextµÄ·½·¨£¬ÒÑʵÊÂÎñ´¦Àí
4 /// </summary>
5 public interface IEfDbContextDependency
6 {
7 /// <summary>
8 /// ÉèÖõ±Ç°¶ÔÏóµÄEntity Framework DbContext
9 /// </summary>
10 /// <param name="dbContext">´«ÈëµÄdbContext</param>
11 void SetDbContext(Finance2Container dbContext);
12
13 /// <summary>
14 /// ÉèÖõ±Ç°¶ÔÏóµÄEntity Framework DbContext
15 /// </summary>
16 /// <param name="dbContext">´«ÈëµÄDbContext</param>
17 /// <param name="lastContext">µ±Ç°¶ÔÏóÔ­À´Ê¹ÓõÄDbContext</param>
18 void SetDbContext(Finance2Container dbContext, out Finance2Container lastContext);
19
20 /// <summary>
21 /// ÁÙʱעÈëDbContext£¬²¢Ö´ÐÐCallback
22 /// ÔÚÖ´Ðйý³ÌÖлáÓÃlockËø×¡±¾¶ÔÏó
23 /// ÔÚÖ´ÐÐÍê³Éºó»á±»»¹Ô­
24 /// </summary>
25 /// <param name="dbContext">ÐèҪעÈëµÄDbContext</param>
26 /// <param name="callback">»Øµ÷</param>
27 void InjectDbContextTemporarily(Finance2Container dbContext, Action callback);
28
29 /// <summary>
30 /// ÁÙʱעÈëDbContext£¬²¢Ö´ÐÐCallback
31 /// ÔÚÖ´Ðйý³ÌÖлáÓÃlockËø×¡±¾¶ÔÏó
32 /// ÔÚÖ´ÐÐÍê³Éºó»á±»»¹Ô­
33 /// </summary>
34 /// <typeparam name="TOut">»Øµ÷ºó·µ»ØµÄÀàÐÍ</typeparam>
35 /// <param name="dbContext">ÐèҪעÈëµÄDbContext</param>
36 /// <param name="callback">»Øµ÷</param>
37 /// <returns>»Øµ÷ºó·µ»ØÖµ</returns>
38 TOut InjectDbContextTemporarily<TOut>(Finance2Container dbContext, Func<TOut> callback);
39 }

/// <summary>
2 /// ÒÀÀµÓÚEntity Framework×öÊý¾Ý´æ´¢µÄ·½·¨µÄÀàµÄ»ùÀà
3 /// °üº¬Í¬²½Entity Framework DbContextµÄ·½·¨£¬ÒÑʵÊÂÎñ´¦Àí
4 /// </summary>
5 public abstract class EfDbContextDependencyBase : IEfDbContextDependency
6 {
7 #region dependencies
8
9 /// <summary>
10 /// DbContext¶ÔÏó£¬ÒÔRepoisitoryģʽÉè¼Æ£¬ËùÒÔʹÓòֿâÃûentities
11 /// ÈκζÔentitiesµÄ¸³Öµ²Ù×÷¶¼»á¶ÔiEfOperatorsToSync½øÐÐͬ²½
12 /// </summary>
13 /// <value>The entities.</value>
14 protected Finance2Container entities
15 {
16 get
17 {
18 return this._entities;
19 }
20 set
21 {
22 this._entities = value;
23
24 //ͬ²½DbContext
25 this.syncIEfDbContextDependencies();
26 }
27 } Finance2Container _entities;
28
29 #endregion
30
31
32 #region constructors
33
34 /// <summary>
35 /// ³õʼ»¯<see cref="EfDbContextDependencyBase" />Àà
36 /// </summary>
37 /// <param name="_entities">±ØÐë´«ÈëÒ»¸öDbContext¶ÔÏó</param>
38 /// <param name="efDbContextDependencies">ÐèÒª×Ô¶¯Í¬²½DbContextµÄÒµÎñ¶ÔÏó</param>
39 public EfDbContextDependencyBase(Finance2Container _entities, params IEfDbContextDependency[] efDbContextDependencies)
40 {
41 this.entities = _entities;
42
43 //ÉèÖÃÒµÎñ¶ÔÏóDbContext×Ô¶¯Í¬²½
44 this.SetSyncIEfDbContextDependencies(efDbContextDependencies);
45 }
46
47 #endregion
48
49
50 #region private methods
51
52 /// <summary>
53 /// ÐèҪͬ²½DbContextµÄIEfDbContextDependencyÐòÁÐ
54 /// </summary>
55 private IEfDbContextDependency[] iEfOperatorsToSync;
56
57 /// <summary>
58 /// ͬ²½IEfOpertorsÖеÄDbContext
59 /// </summary>
60 private void syncIEfDbContextDependencies()
61 {
62 if (iEfOperatorsToSync != null)
63 {
64 foreach (var @operator in iEfOperatorsToSync)
65 {
66 @operator.SetDbContext(this.entities);
67 }
68 }
69 }
70
71 /// <summary>
72 /// ÉèÖÃÐèҪͬ²½DbContextµÄIEfDbContextDependency¶ÔÏó£¬ÉèÖÃÖ®ºó±»ÉèÖõĶÔÏó»áÔÚ±¾¶ÔÏó±»µ÷ÓÃʱ
73 /// ÉèÖÃÖ®ºó£¬µ±±¾¶ÔÏóµÄentities±»×÷ÈκÎset²Ù×÷¶¼»áµ¼ÖÂoperatorsÄÚÈݵÄͬ²½
74 /// </summary>
75 /// <param name="operators">The operators.</param>
76 protected void SetSyncIEfDbContextDependencies(params IEfDbContextDependency[] operators)
77 {
78 this.iEfOperatorsToSync = operators;
79
80 //ͨ¹ýÖØÐ¸´ÖÆentities½øÐÐͬ²½
81 this.entities = this.entities;
82 }
83
84 /// <summary>
85 /// ÁÙʱעÈëDbContext£¬²¢Ö´ÐÐCallback
86 /// ÔÚÖ´Ðйý³ÌÖлáÓÃlockËø×¡ËùÓÐ×¢Èë¶ÔÏó
87 /// ÔÚÖ´ÐÐÍê³Éºó»á±»»¹Ô­
88 /// </summary>
89 /// <param name="dbContext">ÐèҪעÈëµÄDbContext</param>
90 /// <param name="callback">»Øµ÷</param>
91 /// <param name="efDbContextDependencies">ÐèÒª±»×¢ÈëµÄ¶ÔÏóÁбí</param>
92 protected void InjectAllDbContextsTemporarily(Finance2Container dbContext, Action callback, params IEfDbContextDependency[] efDbContextDependencies)
93 {
94 if (efDbContextDependencies == null || efDbContextDependencies.Count() == 0)
95 {
96 callback();
97 return;
98 }
99 //µÝ¹é×¢Èë
100 efDbContextDependencies
101 .First()
102 .InjectDbContextTemporarily(dbContext,
103 () =>
104 {
105 this
106 .InjectAllDbContextsTemporarily(dbContext, callback, efDbContextDependencies.Skip(1).ToArray());
107 });
108 }
109
110 /// <summary>
111 /// ÁÙʱעÈë±¾¶ÔÏóµÄDbContext£¬²¢Ö´ÐÐCallback
112 /// ÔÚÖ´Ðйý³ÌÖлáÓÃlockËø×¡ËùÓÐ×¢Èë¶ÔÏó
113 /// ÔÚÖ´ÐÐÍê³Éºó»á±»»¹Ô­
114 /// </summary>
115 /// <param name="callback">»Øµ÷</param>
116 /// <param name="efDbContextDependencies">ÐèÒª±»×¢ÈëµÄ¶ÔÏóÁбí</param>
117 protected void InjectAllDbContextsTemporarily(Action callback, params IEfDbContextDependency[] efDbContextDependencies)
118 {
119 this
120 .InjectAllDbContextsTemporarily(this.entities, callback, efDbContextDependencies);
121 }
122
123 /// <summary>
124 /// ÁÙʱעÈëDbContext£¬²¢Ö´ÐÐCallback
125 /// ÔÚÖ´Ðйý³ÌÖлáÓÃlockËø×¡ËùÓÐ×¢Èë¶ÔÏó
126 /// ÔÚÖ´ÐÐÍê³Éºó»á±»»¹Ô­
127 /// </summary>
128 /// <typeparam name="TOut">»Øµ÷ºó·µ»ØµÄÀàÐÍ</typeparam>
129 /// <param name="dbContext">ÐèҪעÈëµÄDbContext</param>
130 /// <param name="callback">»Øµ÷</param>
131 /// <param name="efDbContextDependencies">ÐèÒª±»×¢ÈëµÄ¶ÔÏóÁбí</param>
132 /// <returns>»Øµ÷ºó·µ»ØÖµ</returns>
133 protected TOut InjectAllDbContextsTemporarily<TOut> (Finance2Container dbContext, Func<TOut> callback, params IEfDbContextDependency[] efDbContextDependencies)
134 {
135 if (efDbContextDependencies == null || efDbContextDependencies.Length == 0)
136 {
137 return callback();
138 }
139 //µÝ¹é×¢Èë
140 return efDbContextDependencies[0]
141 .InjectDbContextTemporarily(dbContext,
142 () =>
143 {
144 return this
145 .InjectAllDbContextsTemporarily(dbContext, callback, efDbContextDependencies.Skip(1).ToArray());
146 });
147 }
148
149 /// <summary>
150 /// ÁÙʱעÈë±¾¶ÔÏóµÄDbContext£¬²¢Ö´ÐÐCallback
151 /// ÔÚÖ´Ðйý³ÌÖлáÓÃlockËø×¡ËùÓÐ×¢Èë¶ÔÏó
152 /// ÔÚÖ´ÐÐÍê³Éºó»á±»»¹Ô­
153 /// </summary>
154 /// <typeparam name="TOut">»Øµ÷ºó·µ»ØµÄÀàÐÍ</typeparam>
155 /// <param name="callback">»Øµ÷</param>
156 /// <param name="efDbContextDependencies">ÐèÒª±»×¢ÈëµÄ¶ÔÏóÁбí</param>
157 /// <returns>»Øµ÷ºó·µ»ØÖµ</returns>
158 protected TOut InjectAllDbContextsTemporarily<TOut>(Func<TOut> callback, params IEfDbContextDependency[] efDbContextDependencies)
159 {
160 return this
161 .InjectAllDbContextsTemporarily(this.entities, callback, efDbContextDependencies);
162 }
163
164 #endregion
165
166
167 #region IEfDbContextDependency members
168
169 /// <summary>
170 /// ÉèÖõ±Ç°¶ÔÏóµÄEntity Framework DbContext
171 /// </summary>
172 /// <param name="dbContext">´«ÈëµÄdbContext</param>
173 public virtual void SetDbContext(Finance2Container dbContext)
174 {
175 this.entities = dbContext;
176 }
177
178 /// <summary>
179 /// ÉèÖõ±Ç°¶ÔÏóµÄEntity Framework DbContext
180 /// </summary>
181 /// <param name="dbContext">´«ÈëµÄDbContext</param>
182 /// <param name="lastContext">µ±Ç°¶ÔÏóÔ­À´Ê¹ÓõÄDbContext</param>
183 public virtual void SetDbContext(Finance2Container dbContext, out Finance2Container lastContext)
184 {
185 lastContext = this.entities;
186
187 this.SetDbContext(dbContext);
188 }
189
190 /// <summary>
191 /// ÁÙʱעÈëDbContext£¬²¢Ö´ÐÐCallback
192 /// ÔÚÖ´Ðйý³ÌÖлáÓÃlockËø×¡±¾¶ÔÏó
193 /// ÔÚÖ´ÐÐÍê³Éºó»á±»»¹Ô­
194 /// </summary>
195 /// <param name="dbContext">ÐèҪעÈëµÄDbContext</param>
196 /// <param name="callback">»Øµ÷</param>
197 public virtual void InjectDbContextTemporarily(Finance2Container dbContext, Action callback)
198 {
199 //ÔÚÇ¿ÐÐÌæ»»DbContextʱÐèÒªËø×¡¶ÔÏóÒÔÃâ³öÏÖÊý¾ÝÂÒÁ÷ÎÊÌâ
200 lock (this)
201 {
202 //Ìæ»»²¢ÔÝ´æÔ­ÓÐDbContext
203 Finance2Container lastFinanceDbContext;
204 this.SetDbContext(dbContext, out lastFinanceDbContext);
205
206 //»Øµ÷
207 callback();
208
209 //»¹Ô­Ô­ÓÐDbContext
210 this.SetDbContext(lastFinanceDbContext);
211 }
212 }
213
214 /// <summary>
215 /// ÁÙʱעÈëDbContext£¬²¢Ö´ÐÐCallback
216 /// ÔÚÖ´Ðйý³ÌÖлáÓÃlockËø×¡±¾¶ÔÏó
217 /// ÔÚÖ´ÐÐÍê³Éºó»á±»»¹Ô­
218 /// </summary>
219 /// <typeparam name="TOut">»Øµ÷ºó·µ»ØµÄÀàÐÍ</typeparam>
220 /// <param name="dbContext">ÐèҪעÈëµÄDbContext</param>
221 /// <param name="callback">»Øµ÷</param>
222 /// <returns>»Øµ÷ºó·µ»ØÖµ</returns>
223 public virtual TOut InjectDbContextTemporarily<TOut>(Finance2Container dbContext, Func<TOut> callback)
224 {
225 //ÔÚÇ¿ÐÐÌæ»»DbContextʱÐèÒªËø×¡¶ÔÏóÒÔÃâ³öÏÖÊý¾ÝÂÒÁ÷ÎÊÌâ
226 lock (this)
227 {
228 //Ìæ»»²¢ÔÝ´æÔ­ÓÐDbContext
229 Finance2Container lastFinanceDbContext;
230 this.SetDbContext(dbContext, out lastFinanceDbContext);
231
232 //»ñȡִÐнá¹û
233 var result = callback();
234
235 //»¹Ô­Ô­ÓÐDbContext
236 this.SetDbContext(lastFinanceDbContext);
237
238 //·µ»ØÖ´Ðнá¹û
239 return result;
240 }
241 }
242
243 #endregion
244 }

ÀïÃæÖØÒªµÄÊÇ¡°Inject¡±Ò»ÀàµÄ´úÂ룬×÷ÓÃÒ²¾ÍÊǽ«DbContextʵÀý×¢Èëµ½À͹¤ÖУ¬Ê¹µÃÔÚÏà¹ØÊÂÎñÖÐÀ͹¤ÃÇʹÓõÄÊÇͬһ¸öDbContext£¬ÎªÁË·½±ã£¬Ò²¸½´øÁË·ºÐͺͼ¯Ìå×¢ÈëµÄʵÏÖ·½Ê½¡£ÔÝʱÀ´Ëµ¸öÈ˾õµÃÕâÊǸöºÜ±ðŤµÄ°ì·¨£¬Ö®Ç°Ò»Ö±ÔÚѰÇóÒ»ÖÖ×Ô¶¯µÄÒÀÀµ×¢È뷽ʽ£¬Ï£ÍûÖÁÉÙÄܽ«DbContext×¢Èëµ½Ò»´ÎHttpRequestÖУ¬ÓÐʵÏÖ·½·¨µÄÅóÓÑ¿ÉÒÔ@ÏÂÎÒ£¬²»Ê¤¸Ð¼¤¡£

ÁíÒ»¼þÐèÒªÌáµ½µÄ¾ÍÊÇÊÂÎñ£¬ÊÇÕâ¸öÊÂÎñ£¨Transaction£©£¬ÐèҪʹÓÃTransaction²ÅÄܰÑÒ»¼þÔ­×Ó»¯µÄÊÂÎñ°ü×°ÆðÀ´£¬ÒÔ±£Ö¤Ïà¹ØÒµÎñ²Ù×÷ÈçÉèÏëÒ»Ñù£¬±ÈÈçÉêÇëµ¥Èç¹ûÌá½»µ½Ò»°ë·¢ÉúÒì³££¬ÄÇôӦ¸ÃÊǶ¼²»Ìá½»¡£

¼ÓÉÏÊÂÎñºóµÄÓ÷¨£¬Ó¦¸ÃÊÇ£º

voic DoSomeWork()
2 {
3 this.InjectAllDbContextsTemporarily(() =>
4 {
5 using (scope = new TransactionScope())
6 {
7 this.doMyJob();
8 bManager.DoOtherJobs();
9 scope.Complete();
10 }
11 }, bManager);
12 }

Ò²Çë×¢ÒâÒýÓÃSystem.Transactions¡£

±¾Àý£¬Èç¹ûBManagerÖÐÒ²ÓÐÊÂÎñ»á²»»áÓÐÓ°ÏìÄØ£¿²»»á£¬ÒòΪÊÂÎñÊÇ¿ÉÒÔǶÌ׵ģ¬×îºóÖ´ÐÐʱ»áÊÇ×îÍâ²ãµÄTransactionScope.Complete()·½·¨¡£

ËÄ¡¢Éè¼ÆÄ£Ê½

ÕâÊÇÎÒ¾õµÃÔÚʹÓÃEFʱ×îÓÐȤµÄµØ·½£¬ÒòΪÄã¿ÉÒÔÔÚÊý¾ÝÄ£Ð͵Ļù´¡Éϸù¾Ý×Ô¼ºµÄÐèÒª£¬ÎªÆäÌí¼Ó¸ú¶àµÄÒµÎñÌØÐÔ£¬¶øÎÞÐèÓ°Ïìµ½Êý¾Ý±¾Éí¡£ºÜ¶àʱºò£¬ÒòΪÕâÐ©ÌØÐÔ£¬Ê¹µÃÄã¿ÉÒÔ¸ü¼ÓÇãÏòÓھʹ˽â¾öÎÊÌ⣬¶ø²»´òÆÆ·¶Ê½ÒÔÇóÈ«¡£×ÜÌåÀ´Ëµ£¬ÒÔÏÂÉè¼ÆÄ£Ê½µÄÄ¿µÄ¾ÍÊÇΪÁ˱£³ÖÊý¾ÝÓëÆä½á¹¹µÄ´¿½àÐÔµÄÇé¿öÏÂÂú×ãÒµÎñµÄ±éÀúÐÔ¡£

ÖØÃüÃû

Èç¹û´æÔÚÒ»¸öÊôÐÔ»òÒýÓã¬ËüµÄÃû³Æ²»·ûºÏÒµÎñÃèÊö£¬ÄÇô¿ÉÒÔ½«ËüÖØÃüÃû¡£

ÓÐÁ½ÖÖ·½Ê½£¬Ò»ÖÖÊÇÔÚÉè¼ÆÆ÷À½«ÆäÖØÃüÃû£¬±ÈÈçA.User¸Ä³ÉA.Friend£¬ÒÔ·ûºÏÒµÎñÆÚÍûµÄÃèÊö¡£µ«ÓÐʱºò£¬ÕâÑùÊDz»×ãÒÔÂú×ãÐèÇóµÄ£¬ÄÇô¾ÍʹÓÃÀ©Õ¹·½·¨½«ÆäÖØÃüÃû£º

public partial A
{
public User Friend { get { return this.B } }
}

¿çÔ½

²Î¿¼ÉÏÃæ¹ØÏµ²¿·ÖµÄ˵Ã÷£¬Èç¹ûR(A, C) = 1£¬´æÔÚA.BºÍB.C£¬ÄÇôÎÒÃÇ¿ÉÒÔÔÚ²»´´½¨µÄA.CÕæÊµÊý¾ÝµÄÇéÐÎÏ£¬´´½¨A.C×÷ΪA.B.CµÄÖØÃüÃû£º

public partial A
{
public C C { get { return this.B.C; } }
}

»òÐíÒÔÏÂÃüÃû·½Ê½»á¸üÇåÎú£¬»ñÈ¡Óû§ËùÓÐÊ飬¼ÙÉèÓû§ËùÓÐÊé¶¼·ÅÔÚÒ»¸öÊé¹ñÉÏ£º

public partial User
{
public IEnumerable<Book> MyBooks { get { return this.Bookcase.Books; } }
}

¼ÆËã

ÔÚһЩ´øÓÐÒµÎñÌØÐÔµÄÇé¿öÏ£¬¿ÉÒÔÔÚÖØÃüÃûµÄ»ù´¡ÉÏÌí¼ÓÏà¹ØÒµÎñ²Ù×÷£º


public partial User
{
public string FullName
{
get
{
return String.Format("{0} {1}", this.FirstName, this.LastName);
}
}
}

²»¹ýҪעÒâµÄÊÇ£¬ÓÉÓÚͨ³£Ê¹ÓÃLinQ²Ù×÷£¬ËùÒÔÓ¦¾¡Á¿Ê¹Óûº´æ£¬±ÈÈçÑÓ³Ù¼ÓÔØ£º

public partial User
{
public string FullName
{
get
{
if (_fullName == null)
{
_fullName = String.Format("{0} {1}", this.FirstName, this.LastName);
}
return _fullName;
}
}

string _fullName;
}

µ±È»£¬Í¬Ê±»¹¿ÉÒÔÀ©³äΪɸѡ¼ÆËãÖµ£º

public partial User
{
public User BestFriend
{
get
{
return this.Friends.Max(friend => friend.Wealth + friend.GookLooking + friend.Height);
}
}
}

ÔÚÕâÖÖÇé¿öϾͲ»ÄÇô½¨ÒéʹÓÃÑÓ³Ù¼ÓÔØ»òÕß»º´æÁË£¬Èç¹ûMaxÊÇLinQ·½·¨£¬»òÕß»»³ÉÊÇWhere¡¢SelectÖ®ÀàµÄLinQ·½·¨£¬ÄÇôÁôÓÐLinQ×ÔÓеÄÑÓ³Ù¼ÓÔØÌØÐԱȽϺá£

ºÏ²¢

ÔÚ¼ÆËãµÄ»ù´¡ÉÏ£¬¿ÉÒÔ½«Á½¸öͬÀàÐòÁкϲ¢£º

public partial BankAccount
{
public IEnumerable<Record> AllRecords
{
get
{
return this.InputRecords.Union(this.OutputRecords);
}
}
}

·â±Õ

Èç¹û¶ÔÓÚÊý¾Ý£¬·ÃÎÊÐÐÐèÒª½øÐÐÏÞÖÆ£¬Òѱ£Ö¤ÒµÎñ¶ÔÊý¾ÝµÄ¶Áд°²È«£¬ÄÇô¾Í½«Æä·â±Õ¡£

¼ÙÈçclass AccountÓÐÒ»×Ö¶ÎPassword£¬¶ø¸Ã×Ö¶ÎÐèÒª½øÐмÓÃÜ·½ÄÜ´æ´¢£¬ÄÇô¿ÉÒÔ½«Êý¾ÝµÄ×Ö¶ÎPasswordµÄ·ÃÎÊÐÐÉèÖÃΪ˽Óеģ¬È»ºóÖØÐ´Æä¶Áд·½·¨£º

//´Ë²¿·ÖΪEF×Ô¶¯Éú³É²¿·Ö
public Account
{
public string Password { private get; private set; }
}

public partial Account
{
public EncryptedPassword { get { return this.Password; } }

public SetPassword(string originalPassword)
{
this.Password = EncryptHelper.Encrypt(originalPassword);
}
}

·ÖÀà

ÔÚÒ»¸ö¡°»ùÀࡪ¡ªÅÉÉúÀàȺ¡±µÄ¹ØÏµ¼¯ºÏÀÈç¹ûÊý¾ÝµÄÈë¿ÚΪ»ùÀàµÄ¼¯ºÏ£¬¶ø´¦ÀíÖÐÐèÒª·ÖÀ࣬ÔòÐèҪͨ¹ý¼Ì³ÐÔ¼Êø£¬¼´¶à̬ʵÏÖÈ·¶¨Æä¾ßÌåÌØÐÔ¡£

µ±È»£¬Äã¿ÉÒÔʹÓÃtypeOf£¬»òÕßOfType<T>()À´½øÐйéÀ࣬µ«Ç°Õß´úÂ벻̫ÃÀ¹Û£¬ºóÕßÐÔÄܽϵͣ¬Ã¿´Î¶¼Òª±éÀú¡£

ÕâÀïÊÇÆäÖÐÒ»ÖÖʾÀý£¬Ê×ÏÈ´æÔÚÒÔϹØÏµ£¬²¢Í¨¹ýÉè¼ÆÆ÷´´½¨ÁËÒ»¸öEnum£¨Ã¶¾Ù£©¡£ÆäÖл·¾³ÐèÒªÔÚ.NET Framework 4.5+ºÍEF 5+£¬·ñÔòö¾ÙÒ²¿ÉÒÔÖ±½ÓÔÚÏîÄ¿ÖÐÌí¼Ó¶ø²»Í¨¹ýEFÉè¼ÆÆ÷£º

È»ºó£¬ÏÖÓлùÀàµÄÀ©Õ¹£º

public partial class BaseType
{
public abstract MyType Type { get; }
}

È»ºó·Ö±ðÀ©Õ¹ÅÉÉúÀࣺ

public partial class AType
{
public override MyType Type { get { return MyType.A; } }
}

public partial class AType
{
public override MyType Type { get { return MyType.A; } }
}

ÄÇô£¬ÔÚʹÓÃÖУ¬¼´¿É·ÖÀà´¦Àí£º

var entities = new EntityFrameworkDemoContainer();
var allTypes = entities.BaseTypes;
foreach (var type in allTypes)
{
switch (type.Type)
{
case MyType.A:
Console.WriteLine("It's an A.");
break;
case MyType.B:
Console.WriteLine("It's an B.");
break;
}
}

ÔÚʵ¼ÊÓ¦ÓÃÖУ¬»¹¿ÉÒÔ¶¨Òå¸ü¶àµÄ·½·¨¡¢ÌØÐÔ£¬±ÈÈçÐòÁл¯¡£

¹éÀà

µ±Á½¸öûÓÐÀàÐÍÏà¹ØµÄʵÌåÓµÓÐÏàÍ¬ÌØÐÔµÄʱºò£¬ÔÚÕë¶ÔijÏî¹²ÐԵĴ¦ÀíÖУ¬¿ÉÒÔ½«ËüÃǹéÀà¡£

ÕâÖÖ·½Ê½Í¨³£Óù²ÓеĽӿÚÀ´ÊµÏÖ£¬ÓýӿÚÀ´ÃèÊö£¨·ÇÔ¼Êø£©Æä¹²ÓеÄÌØÐÔ¡£

±ÈÈç´æÔÚÈçϹØÏµ£º

Èç¹ûÎÒÐèÒª±éÀúËùÓÐÒýÓÃÁË£¨ÒÀÀµÓÚ£©ComponentµÄ¶ÔÏó£¬ÄÇôÎÒÐèÒª½«ËùÓÐÒýÓÃÕßͬÖÊ»¯£¬ÒÀ´Î´´½¨ÒÔÏ´úÂ룺

public interface IComponentDependency
{
Component Component { get; set; }
} public partial class Car : IComponentDependency
{
}

public partial class Plane : IComponentDependency
{
}

public partial class EntityFrameworkDemoContainer
{
public IEnumerable<IComponentDependency> AllComponentDependencies
{
get
{
return ((IEnumerable<IComponentDependency>)this.Cars)
.Union(this.Planes);
}
}
}

¿ÉÒÔ¿´µ½£¬Í¨¹ý´´½¨´øÓÐComponentµÄIComponentDependency½Ó¿Ú£¬È»ºó²¢ÎªCarºÍPlaneÌí¼Ó´Ë½Ó¿Ú£¬±ä¿ÉÒÔ½«ËùÓÐCarºÍPlane¹éÀàΪComponentDependencies¶ø²»ÐèҪͨ¹ýËüÃÇÓµÓй²Í¬µÄ¸¸ÀàʵÏÖ¡£¶øÊ¹Ó÷½Ã棬Ôò¿ÉÒÔ£º

var entities = new EntityFrameworkDemoContainer();

var allComponentDependencies = entities.AllComponentDependencies;
foreach (var componentDependency in allComponentDependencies)
{
Console.WriteLine("I find a component.");
}

Îå¡¢ÒµÎñģʽ

µ±ËùÓÐÒµÎñ£¬¶¼ÊÇÓɹ¤×÷ʵÌ壨Unit of Work£©£¬ÒÔÉ϶¨ÒåµÄÀ͹¤£¨Worker£©½øÐвÙ×÷Íê³ÉµÄ¡£ÓÉÓÚDbContext²Ù×÷µÄÔ­×ÓÐÔ£¬²»Í¬µÄWorker¼äÐèÒª¹²Í¬¹¤×÷¾ÍÐèÒª¿çÔ½´ËÕϰ­¡£

À͹¤ÃÇͨ³£ÓкܶàÏàËÆµÄ¹¤×÷ÄÚÈÝ£¬ËùÒÔÔÚ½Ó¿ÚÉè¼ÆµÄʱºò¿ÉÒÔÌṩһЩ¹«¹²½Ó¿Ú»òÕßʵÏÖ£º

ͨ¹ýID»ñÈ¡¾ßÌåʵÌåµÄ½Ó¿Ú£º

/// <summary>
/// ÓÃID»ñÈ¡EntityµÄ½Ó¿Ú
/// </summary>
/// <typeparam name="TEntity">EntityµÄÀàÐÍ</typeparam>
public interface IId<TEntity>
{
/// <summary>
/// »ñȡӵÓÐIDµÄEntity
/// </summary>
/// <param name="id">ID</param>
/// <returns>Entity</returns>
TEntity this[int id] { get; }
}

»ñÈ¡ËùÓÐͬÀàʵÌ壺

/// <summary>
/// ËùÓÐEntityµÄ½Ó¿Ú
/// </summary>
/// <typeparam name="TEntity">EntityµÄÀàÐÍ</typeparam>
public interface IAll<TEntity>
{
/// <summary>
/// »ñÈ¡ËùÓÐEntity
/// </summary>
/// <value>ËùÓÐEntity</value>
IEnumerable<TEntity> All { get; }
}

´´½¨¡¢Ìí¼Ó¡¢ÒƳý£º

/// <summary>
/// ´´½¨ÊµÌåµÄ½Ó¿Ú
/// </summary>
/// <typeparam name="TEntity">EntityµÄÀàÐÍ</typeparam>
public interface ICreate<TEntity>
{
/// <summary>
/// ´´½¨ÐÂEntity
/// </summary>
/// <returns>ÐÂEntity</returns>
TEntity Create();
} /// <summary>
/// Ìí¼ÓEntityµÄ½Ó¿Ú
/// </summary>
/// <typeparam name="TEntity">EntityµÄÀàÐÍ</typeparam>
public interface IAdd<TEntity>
{
/// <summary>
/// Ìí¼ÓÒ»¸öÐÂÏî
/// </summary>
/// <param name="newItem">ÐèÒªÌí¼ÓµÄÐÂÏî</param>
/// <returns>Ìí¼ÓºóµÄÏî</returns>
TEntity Add(TEntity newItem);
} /// <summary>
/// ÒÆ³ýEntityµÄ½Ó¿Ú
/// </summary>
/// <typeparam name="TEntity">EntityµÄÀàÐÍ</typeparam>
public interface IRemove<TEntity>
{
/// <summary>
/// ÒÆ³ýEntityµÄ½Ó¿Ú
/// </summary>
/// <param name="id">EntityµÄID</param>
void Remove(int id);
}

ÔÚÏîÄ¿ÖУ¬ÎÒ²¢Ã»ÓÐÌṩ¸üÐµķ½·¨£¬ÒòΪÑϸñµØ·Ö²ãÀ´Ëµ£¬ÉϲãÎÞ·¨¿çÔ½ÒµÎñմȾÊý¾Ý²ãÃæµÄDbContext¶ÔÏó£¬×ÔÈ»²»´æÔÚ¸ü¸ÄEntityµÄÐÐΪ¡£Í¬Ê±Ò²ÎªÁËÒµÎñ°²È«ºÍ¹æ·¶Ô¼Êø£¬ËùÓиü¸Ä²Ù×÷¶¼Ó¦¸Ãͨ¹ýÒµÎñ²ãÃæ½øÐвÙ×÷¡£Èç¹ûÖ»ÊÇ´«²ÎʵÌ壬ҵÎñ²ãÔòÎÞ·¨°ÑÎÕUIµÈÉϲ㵽µ×¶ÔEntity½øÐÐÁËʲôÐ޸ģ¬ÉõÖÁÓпÉÄܶÔEntityÏà¹ØµÄÆäËûEntity½øÐпçÔ½ÒµÎñµÄÐ޸ġ£ÔÚÒ»°ãÇé¿öÏ£¬Á¬IAddÒ²²»Ó¦¸ÃÓС£

½èÖú

µ±Ò»¸öWorkerÐèÒªÁíÒ»¸öWorkerµÄЭ×÷£¬ÔòÖ±½ÓÒÀÀµ²¢ÒýÓöÔÏóWorker£¬¼´¡°½èÖú¡±¸ÃWorker¡£

¼ÙÉèÓÐÒ»¸üÐÂÉêÇëµ¥µÄ·½·¨£¬ÐèÒªµ±Ç°Óû§·½ÄܽøÐвÙ×÷£¬ÔòÉæ¼°ÁËUserManager£¬ApplicationManager¹²Í¬¹¤×÷µÄÄÚÈÝ£¬ÊµÏÖµ±ÈçÏ£º

public interface IApplicationManager
: IEfDbContextDependency
, IId<Application>
{
void Edit(int applicationId, string content);
} public class ApplicationManager : EfDbContextDependencyBase
, IApplicationManager
{
IUserManager userManager;

public ApplicationManager(IUserManager userManager
, MyContainer entities)
: base(entities)
{
this.userManager = userManager;
}

public Application this[int id]
{
get
{
return this.entities.Applications.FirstOrDefault(application => application.Id == id);
}
}

public void Edit(int applicationId, string content)
{
//»ñÈ¡Ïà¹ØÉêÇëµ¥
var application = this[applicationId];
//»ñÈ¡µ±Ç°Óû§
var currentUser = userManager.CurrentUser;
//Ö»Óе±µ±Ç°Óû§ÎªÉêÇëÈ˲ſÉÒÔÐÞ¸Ä
if (application.Applicant.Id == currentUser.Id)
{
//ÐÞ¸ÄÉêÇëµ¥
...
this.entities.SaveChanges();
}
}
}

ÒýÓÃ

µ±±¾À͹¤ÐèËù´¦ÀíµÄʵÌå²úÆ·ÐèÒªÒÀÀµÓÚÆäËûÀ͹¤ÌṩµÄ²úÆ·£¬ÄÇô¾ÍÐèҪͬ»¯¶þÕßµÄDbContext¡£

±ÈÈçÐèÒªÌí¼ÓÉêÇëµ¥£¬ÄÇô¾ÍÐèÒª½«µ±Ç°Óû§×÷ΪÉêÇëµ¥µÄÉêÇëÈË£¬ÒýÓÃÉÏÃæµÄ´úÂ벢ʡÂÔÒ»²¿·Ö£º

public partial ApplicationManager
{
public Application Apply(string content)
{
userManager.InjectDbContextTemporarily(this.entities, () =>
{
//»ñÈ¡µ±Ç°Óû§£¬×÷ΪÉêÇëÈË
var currentUser = userManager.CurrentUser;
var newApplication = new Application
{
Application = currentUser,
Content = content
};

this.entities.Applications.Add(newApplication);
this.entities.SaveChanges();

return newApplication;
});
}
}

ºÏ×÷

µ±Ò»¸öÒµÎñ£¬ÐèÒª¶à¸öWorkerºÏ×÷Íê³É£¬²¢ÇҸù¤Ðò¾ßÓÐÔ­×ÓÐÔ£¬Ôò½«ËüÃÇ·â×°ÔÚÒ»¸öÊÂÎñÀï¡£

ÕâÀÏÈÓÃÏîÄ¿ÖеÄÒ»¶Î´úÂë½øÐÐʾ·¶£¬×¢ÊͺʹúÂë¶¼ÊÇÏîÄ¿Öеģº

 1 /// <summary>
2 /// Ìí¼ÓлãÂÊ
3 /// </summary>
4 /// <param name="exchangeRateRuleId">»ãÂʹæÔòID</param>
5 /// <param name="time">Ìí¼Óµ½µÄʱ¼äµã</param>
6 /// <param name="rate">±ÈÂÊ</param>
7 /// <param name="inverseRate">·´Ïò±ÈÂÊ</param>
8 /// <returns>ÐÂÌí¼ÓµÄ»ãÂÊ</returns>
9 /// <exception cref="GM.OA.Finance2.Domain.FinancialBase.ExchangeRate.RateIsZeroException"> ±ÈÂÊ»ò·´Ïò±ÈÂÊΪ0ʱÅ׳ö´ËÒì³£</exception>
10 /// <exception cref="GM.OA.Finance2.Domain.FinancialBase.ExchangeRate.ExchangeRateAlreadyExistException"> µ±ÌìµÄ»ãÂÊÒÑÉèÖÃʱÅ׳ö´ËÒì³£</exception>
11 public DataAccess.ExchangeRate Add(int exchangeRateRuleId, DateTime time, decimal rate, decimal inverseRate)
12 {
13 //±ÈÂʲ»µÃΪ0
14 if (rate == 0 || inverseRate == 0)
15 {
16 throw new RateIsZeroException();
17 }
18
19 //Èç¹ûͬʱ¼äµã»ãÂÊÒÑ´æÔÚ£¬ÔòÅ׳öÒì³£
20 var existExchangeRate = entities
21 .ExchangeRates
22 .FirstOrDefault(item =>
23 item.ExchangeRateRule.Id == exchangeRateRuleId
24 && item.Time == time);
25 if (existExchangeRate != null)
26 {
27 throw new ExchangeRateAlreadyExistException(existExchangeRate);
28 }
29
30 //»ñÈ¡»ãÂʹæÔò
31 var exchangeRateRule = this.ExchangeRateRuleManager[exchangeRateRuleId];
32
33 //´´½¨Ò»¶ÔÕý·´µÄ¶Ò»»»ãÂÊ
34 //Õý¶Ò»»»ãÂÊ
35 var exchangeRate = new DataAccess.ExchangeRate
36 {
37 Time = time,
38 ExchangeRateRule = exchangeRateRule//¹ØÁª»ãÂʹæÔò
39 };
40 //·´¶Ò»»»ãÂÊ
41 var inverseExchangeRate = new DataAccess.ExchangeRate
42 {
43 Time = time,
44 ExchangeRateRule = exchangeRateRule.InverseExchangeRateRule//¹ØÁª·´ÏòµÄ»ãÂʹæÔò
45 };
46 exchangeRate.InverseExchangeRate = inverseExchangeRate;//»¥ÏàÉèÖÃΪ·´Ïò»ãÂÊ
47 //ÉèÖûãÂÊ
48 exchangeRate.SetRate(rate, inverseRate);
49
50 //ÓÉÓÚ»ãÂÊ»¥Îª·´Ïò»ãÂÊ£¬µ¼ÖÂÊý¾Ý¶ÔÏó»·×´£¬ËùÒÔÐèÒª¹æ·¶Ë³Ðò½øÐÐÊÂÎñ²åÈë
51 using (var scope = new TransactionScope())
52 {
53 //³Ö¾Ã»¯Êý¾Ý
54 this.entities.ExchangeRates.Add(exchangeRate);
55 this.entities.SaveChanges();
56
57 //ÉèÖ÷´Ïò»ãÂÊ
58 inverseExchangeRate.InverseExchangeRate = exchangeRate;
59 this.entities.SaveChanges();
60
61 scope.Complete();
62 }
63
64 //·µ»Ø²åÈëºóµÄжÔÏó
65 return exchangeRate;
66 }

ÕâÊDzåÈëÒ»¸öеĻãÂÊ£¬±ÈÈ磤¶Ò»»$µÄ»ãÂÊ£¬Í¬Ê±Ò²Òª´´½¨$¶Ò»»£¤µÄ»ãÂÊ£¬ÓÉÓÚÓмÆËãÎó²îºÍһЩÂòÂô²î¼Û£¬ËùÒÔÁ½¸ö»ãÂʲ»Ò»¶¨Ñϸñ°´ÕÕ·´±È´æÔÚ£¬¶øÊÇÊÖ¶¯É趨µÄÖµ£¬ÕâÊÇÒµÎñ²¿·Ö¡£¶øÔÚʵÏÖ²¿·Ö£¬¿ÉÒÔÖªµÀÕâÑùµÄÇé¿öÏ£¬Ò»¸ö»ãÂÊ»á¹ØÁªÁ½¸ö»ãÂʹæÔò£¨£¤<=>$¡¢$<=>£¤£©£¬ÄÇô¾ÍÐγÉÁË¡°»·¡±£¬²åÈëµÄʱºòÎÞ·¨µ¥²½Ö´ÐУ¬ËùÒÔÐèÒªÖð²½Ö´ÐУ¨¶à´ÎSaveChanges()£©²¢Í¨¹ýScope½øÐзâ×°¡£ÎÒÏ룬ÔÚÊÂÎñ·½ÃæÃ»Ê²Ã´ÒÉÎÊ¡£

ÄÇô£¬ÔÚÉÏÎÄÀ˵µ½¹ý£¬ÊÂÎñÊÇ¿ÉÒÔǶÌ׵쬶øÇ¶Ì×ÒÔ×îÍâ²ãµÄTransactionScope.Complete()Ϊ×îÖÕÖ´Ðе㡣µ±ÄãÐèÒª¶à¸ö²»Í¬µÄWork¹²Í¬½øÐвÙ×÷£¬²¢ÇҸòÙ×÷¾ßÓÐÔ­×ÓÐÔµÄʱºò£¬Äã¿ÉÒÔÔÚ×¢ÈëDbContextºóÓÃTransactionScope½«Æä°ü¹ü£º

1 /// <summary>
2 /// ´ÓÖ¸¶¨ÕË»§×ªÈëÖ¸¶¨½ð¶îµ½ÁíÒ»¸öÖ¸¶¨ÕË»§
3 /// ¶Ò»»ËÄÉáÎåÈë±£ÁôÁ½Î»Ð¡Êý
4 /// </summary>
5 /// <param name="withdrawalAccountId">ת³öÕË»§ID</param>
6 /// <param name="depositAccountId">תÈëÕË»§ID</param>
7 /// <param name="transferAmount">תÕ˽ð¶î</param>
8 /// <param name="withdrawalCurrencyCode">±Ò±ðÓ¢Îĵ¥Î»£¬ Ϊ¿ÕÔòʹÓÃĬÈϱұð£¬Ò»°ãÈÏΪÊÇÈËÃñ±Ò</param>
9 /// <param name="exchangeRateId">»ãÂÊID£¬Èç¹û²»Îª¿ÕÔòʹÓøûãÂʽøÐÐתÕË</param>
10 /// <param name="remarks">±¸×¢</param>
11 /// <returns>תÕËÈÕÖ¾</returns>
12 public TBalanceTransferRecord TransferTo(int withdrawalAccountId, int depositAccountId,
13 decimal transferAmount,
14 string depositCurrencyCode = null,
15 int? exchangeRateId = null,
16 string remarks = null)
17 {
18 //Èç¹û±Ò±ðΪ¿ÕÔòÉèÖÃĬÈϱұð
19 if (depositCurrencyCode == null)
20 {
21 depositCurrencyCode = Configurations.DefaultCurrencyCode;
22 }
23
24 //´¦Àí»ãÂʺÍתÈëת³ö¾ßÌåÖµ
25 DataAccess.ExchangeRate exchangeRate;
26 decimal withdrawalAmount;
27 decimal depositAmount = transferAmount;
28
29 //¸ù¾Ý²»Í¬µÄ»ãÂÊÇé¿ö¼ÆËãתÈëת³ö½ð¶î
30 if (exchangeRateId == null)//ûÓлãÂʵÄÇé¿ö
31 {
32 exchangeRate = null;
33 //ûÓлãÂʵÄÇé¿öÏÂתÈëºÍת³ö¶ÔµÈ
34 withdrawalAmount = depositAmount;
35 }
36 else
37 {
38 //»ñÈ¡»ãÂÊ
39 exchangeRate = exchangeRateManager[exchangeRateId.Value];
40
41 //Èç¹û»ãÂÊΪ¿Õ£¬ÔòÅ׳öÒì³£
42 if (exchangeRate == null)
43 {
44 throw new ExchangeRateNullException(exchangeRateId.Value);
45 }
46
47 //Èç¹û»ãÂʵÄÍâ±Ò²»ÊÇתÈë±Ò±ð£¬ÔòʹÓ÷´Ïò»ãÂÊ
48 if (exchangeRate.ExchangeRateRule.ForeignCurrency.Code != depositCurrencyCode)
49 {
50 exchangeRate = exchangeRate.InverseExchangeRate;
51 }
52
53 //Èç¹û»ãÂÊÍâ±ÒÒÀ¾É²»ÊÇתÈë±Ò±ð£¬ÔòÎÞ·¨Ê¹ÓøûãÂÊ£¬Å׳öÒì³£
54 if (exchangeRate.ExchangeRateRule.ForeignCurrency.Code != depositCurrencyCode)
55 {
56 throw new ExchangeRateNotMatchException(currencyManager[depositCurrencyCode], exchangeRate);
57 }
58
59 //ת³ö½ð¶îͨ¹ý»ãÂÊ»»Ë㣬ËÄÉáÎåÈë±£ÁôÁ½Î»Ð¡Êý
60 withdrawalAmount = Math.Round(depositAmount * exchangeRate.InverseExchangeRate.Rate, 2, MidpointRounding.AwayFromZero);
61 }
62
63 //ÐèҪʹÓÃÒÔÏ»ãÂÊÒµÎñ£¬×¢ÈëDbContext
64 var record = exchangeRateManager
65 .InjectDbContextTemporarily(this.entities, () =>
66 {
67 //½«×ªÈëת³ö¼¯ÖÐÔÚÒ»¸öÊÂÎñÖÐ
68 using (var scope = new TransactionScope())
69 {
70 var withdrawalRecord = this
71 .AdjustBalance(withdrawalAccountId,
72 -withdrawalAmount,//!Attension!: ×¢ÒâÕâÀïΪ¸ºÊý£¬ÒòΪΪת³ö
73 exchangeRate == null
74 ? depositCurrencyCode
75 : exchangeRate.ExchangeRateRule.DomesticCurrency.Code);
76 var depositRecord = this
77 .AdjustBalance(depositAccountId,
78 depositAmount,
79 depositCurrencyCode);
80
81 //´´½¨ÐÂÈÕÖ¾
82 var newTransferRecord = createNewTransferRecord(withdrawalRecord, depositRecord, transferAmount, exchangeRate);
83
84 //Èç¹ûÀàÐͲ»Æ¥Å䣬ÔòÅ׳öÒì³£
85 if (newTransferRecord.GetType() != typeof(TBalanceTransferRecord))
86 {
87 throw new BalanceTransferRecordTypeNotMatchException<TBalanceTransferRecord>();
88 }
89
90 //ÉèÖÃÈÕÖ¾ÄÚÈÝ
91 var transferRecord = (TBalanceTransferRecord)newTransferRecord;
92 transferRecord.WithdrawalBalanceChangeRecord = withdrawalRecord;
93 transferRecord.DepositBalanceChangeRecord = depositRecord;
94 transferRecord.ExchangeRate = exchangeRate;
95 transferRecord.Remarks = remarks;
96
97 //³Ö¾Ã»¯ÈÕÖ¾
98 this.entities.BalanceTransferRecords.Add(transferRecord);
99 this.entities.SaveChanges();
100
101 //½áÊøÊÂÎñ
102 scope.Complete();
103
104 return transferRecord;
105 }
106 });
107
108 return record;
109 }

ÕâÒ²ÊÇÏîÄ¿ÖеĴúÂ룬¼´´ÓÒ»¸öÕË»§ÓÃij¸ö»ãÂÊתÕËÒ»¶¨½ð¶îµ½ÁíÒ»¸öÕË»§¡£

Áù¡¢ÏîÄ¿µü´ú

ÿ´ÎÐÞ¸ÄEntity Modelºó£¬Ö±½ÓÔËÐÐÉú³ÉµÄSQL£¬¾Í¿ÉÒÔ»ñµÃеÄÊý¾Ý¿âÁË£¬µ«Í¬Ê±Ò²Çå¿ÕÁËÔ­À´µÄÊý¾Ý¡£

ËùÒÔÎÒÐèÒªÒ»¸ö³õʼ»¯¿ª·¢²âÊÔÊý¾ÝµÄ·½Ê½£¬±ãÔÚÏîÄ¿ÖÐÌí¼ÓÁ˳õʼ»¯·½·¨£¬´´½¨ÁËÒ»¸ö¼òµ¥(lou)µÄ³õʼ»¯¹¤¾ß£¬·½±ã³õʼ»¯Ò»Ð©Êý¾Ý£º

ÓÐÁ˳õʼ»¯¹¤¾ßºó£¬ÏîÄ¿µÄµü´ú·½Ê½´óÖÂÊÇ£ºÐÞ¸ÄEntity Model =¡· ÖØÐÂÉú³ÉÊý¾Ý¿â =¡· ÐÞ¸Ä/²»Ð޸ijõʼ»¯¹¤¾ß =¡· ³õʼ»¯Êý¾Ý¡£ÄÄÅÂÊÇÒ»¸ö×ֶεÄÐ޸쬶¼¿ÉÒÔÂíÉϸüÐÂÊý¾Ý¿âÉè¼Æ£¬È»ºó¼ÌÐøÏÂÒ»²½¿ª·¢¡£

µ±È»£¬Õâ¸öÁ÷³ÌÈ´²»ÊÊÓÃÔÚÉú²ú»úÉÏ£¬ÕâÊÇÏÖÔÚÓöµ½µÄÒ»¸öÄÑÌâ¡£Èç¹û·¢²¼Éú²úºó£¬Êý¾Ý¿âÖÐÓÐÁËÕæÊµÊý¾Ý£¬ÄÇô¸ü¸Ä¾Í񻃾¼°Êý¾ÝÇ¨ÒÆµÄÊÂÁË£¬ÊÂÇé¾Í±äµÃ²»ÄÇô¼òµ¥¡£

   
3771 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

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

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

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ʹÓÃ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Ó¦ÓÃϵͳ¼Ü¹¹