ÉϴβÅ˵Ҫ·ÖÏíÈ¥ÄêµÄÏîÄ¿£¬Õâ´ÎÒ»ÏÂ×Ó±»Ðµ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£¬ÐèÒª£º
ÄÇô¾ÍÓ¦¸Ã²Î¿¼ºóÃæµÄ¡°À©Õ¹×ֶΡ±²¿·ÖÁË¡£
¸´ÔÓÒ»µã£¬Èç¹û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õʼ»¯¹¤¾ß
=¡· ³õʼ»¯Êý¾Ý¡£ÄÄÅÂÊÇÒ»¸ö×ֶεÄÐ޸쬶¼¿ÉÒÔÂíÉϸüÐÂÊý¾Ý¿âÉè¼Æ£¬È»ºó¼ÌÐøÏÂÒ»²½¿ª·¢¡£
µ±È»£¬Õâ¸öÁ÷³ÌÈ´²»ÊÊÓÃÔÚÉú²ú»úÉÏ£¬ÕâÊÇÏÖÔÚÓöµ½µÄÒ»¸öÄÑÌâ¡£Èç¹û·¢²¼Éú²úºó£¬Êý¾Ý¿âÖÐÓÐÁËÕæÊµÊý¾Ý£¬ÄÇô¸ü¸Ä¾Í񻃾¼°Êý¾ÝÇ¨ÒÆµÄÊÂÁË£¬ÊÂÇé¾Í±äµÃ²»ÄÇô¼òµ¥¡£
|