Õâ¶Î´úÂëÔÙ¼òµ¥²»¹ý£¬ÏÈͨ¹ý context »ñÈ¡ adTextUnit ʵÌå¶ÔÏó£¬È»ºó½øÐÐÐÞ¸ÄÒ»¸öÊôÐÔÖµ£¬×îºó½øÐб£´æ£¬ÐèҪעÒâµÄÊÇ£¬ÎÒÃDz¢Ã»ÓÐÏñ֮ǰÄÇÑùÊÖ¶¯ EntityState.Modified ÅäÖã¬ÔÚÐÞ¸ÄÊôÐÔÖµµÄʱºò£¬EF »áͨ¹ý EntityChangeTracker ×·×ÙÕâ¸öÖµµÄÐ޸ģ¬È»ºóÔڳ־û¯µÄʱºò£¬½øÐмì²â²¢Éú³É×îÖÕµÄ SQL ´úÂ룺
exec sp_executesql N'UPDATE [dbo].[AdTextUnits] SET [DateUpdated] = @0 WHERE ([Id] = @1) ',N'@0 datetime2(7),@1 int',@0='2015-10-27 21:23:20.4506808',@1=4´Ó SQL Server Profiler ²¶»ñµÄ SQL£¬¾Í¿ÉÒÔ¿´³ö EF ÊǺÜÖÇÄܵģ¬Èç¹ûÎÒÃǰÑÉÏÃæµÄ²âÊÔ´úÂ룬¸Ä³ÉÏÂÃæÕâÑù£º
[Fact] public void DbContextTest() { using (var context = new CNBlogsAdDbContext()) { var adTextUnit = context.Set<AdTextUnit>().FirstOrDefault(); adTextUnit.DateUpdated = DateTime.Now; context.Entry<AdTextUnit>(adTextUnit).State = EntityState.Modified; context.SaveChanges(); } }ÊÖ¶¯¼ÓÁËÒ»¸öʵÌå State Ð޸ģ¬×îºóÉú³ÉµÄ SQL ÈçÏ£º
exec sp_executesql N'UPDATE [dbo].[AdTextUnits] SET [AdTextId] = @0, [AdTextModuleId] = @1, [StartDate] = @2, [EndDate] = @3, [Sort] = @4, [IsActive] = @5, [DateAdded] = @6, [DateUpdated] = @7, [OperatorName] = @8 WHERE ([Id] = @9) ',N'@0 int,@1 int,@2 datetime2(7),@3 datetime2(7),@4 int,@5 bit,@6 datetime2(7),@7 datetime2(7),@8 nvarchar(max) ,@9 int',@0=1,@1=1,@2='2015-10-19 00:00:00',@3='2016-10-19 00:00:00',@4=4,@5=1,@6='2015-10-19 00:00:00',@7='2015-10-27 21:43:16.8353133',@8=N'ÌïÔ°ÀïµÄó¬ó°',@9=4½á¹ûÊÇ AdTextUnit µÄÈ«²¿ÊôÐÔ½øÐÐÁ˸üУ¬ÎªÊ²Ã´»áÕâÑùÄØ£¿¾ÍÊÇÒòΪÎÒÃÇÇ¿ÖÆ¶Ô EF ˵£¬AdTextUnit ±»¸ü¸ÄÁË£¬Äã¼Ç¼µÄ EntityChangeTracker ÎÞЧÁË£¬µ«ÎÒÃÇû¾ßÌåÖ¸³öÄĸöÖµ±»¸ü¸ÄÁË£¬ËùÒÔ×îºó EF °ÑËùÓÐÊôÐÔÖµ¶¼¸ü¸ÄÁËÒ»±é£¬ÓÉÕâ¸öʾÀý£¬ÎÒÃÇ¿ÉÒÔ¿´³ö£¬¾¡Á¿²»Òª¡°¶à´ËÒ»¾Ù¡±µÄ¶Ô Entry State ״̬½øÐиü¸Ä£¬Ê²Ã´Çé¿öÏÂ»á½øÐиü¸ÄÄØ£¿¾ÍÊÇÎÒÃÇÔÚ¶ªÊ§ EntityChangeTracker µÄÇé¿öÏ£¬Ò²¾ÍÊÇ˵ʵÌå¶ÔÏó²¢²»ÊÇÓÉ DbContext ½øÐлñÈ¡µÄ£¬±ÈÈçÏÂÃæÕâ¶Î´úÂ룺
[Fact] public void DbContextTest() { using (var context = new CNBlogsAdDbContext()) { var adTextUnit = new AdTextUnit { Id = 1 }; adTextUnit.DateUpdated = DateTime.Now; context.Entry<AdTextUnit>(adTextUnit).State = EntityState.Modified; context.SaveChanges(); } }×¢Òâ Modified£¬¶ø²»ÊÇ Added£¬Õâ¶Î´úÂëÊÇ¿ÉÒÔÖ´Ðгɹ¦µÄ£¬ÒòΪ adTextUnit ÊÇÎÒÃÇÊÖ¶¯½øÐд´½¨µÄ£¬Èç¹û²»¶Ô Entry State ״̬½øÐнøÐÐÉèÖã¬Ö´ÐÐÊǻᱨ´íµÄ£¬ÎªÊ²Ã´£¿ÒòΪ EF ×îºóÖ´ÐÐ SaveChanges ¼ì²â²»µ½ EntityChangeTracker¡£
¸Ð¾õԽ˵ԽÂÒÁË£¬¹ØÓÚ EntityChangeTracker ¾Í˵µ½Õ⣬Á˽âÁËÕâô¶à£¬¸Ð¾õ¿ÉÒÔ¶ÔÒ»¿ªÊ¼µÄÄǶβâÊÔ×ö³öһЩ½âÊÍ£¬µ«ºÃÏñ»¹²îʲô£¿ÊÇÊ²Ã´ÄØ£¿¾ÍÊÇ Proxy£¨´úÀí£©¡£
Proxy£¨´úÀí£©£ºÎª POCO ʵÌåÀàÐÍ´´½¨ÊµÀýʱ£¬ÊµÌå¿ò¼Ü³£³£Îª³äµ±ÊµÌå´úÀíµÄ¶¯Ì¬Éú³ÉµÄÅÉÉúÀàÐÍ´´½¨ÊµÀý¡£´Ë´úÀíÖØÐ´ÊµÌåµÄijЩÐéÄâÊôÐÔ£¬ÕâÑù¿ÉÔÚ·ÃÎÊÊôÐÔʱ²åÈë¹Ò¹³£¬´Ó¶ø×Ô¶¯Ö´ÐвÙ×÷¡£ÀýÈ磬´Ë»úÖÆÓÃÓÚÖ§³Ö¹ØÏµµÄÑÓ³Ù¼ÓÔØ¡£±¾Ö÷ÌâÖÐËùʾ·½·¨Í¬ÑùÊÊÓÃÓÚʹÓà Code First ºÍ EF Éè¼ÆÆ÷´´½¨µÄÄ£ÐÍ¡£
ÐèҪעÒâ¹Ø¼ü´Ê£ºÐéÄâÊôÐÔ£¨virtual£©£¬ÕâÒ²¾ÍÊÇΪʲô AdTextUnit ÓÐÎÊÌ⣬¶øÆäËûÊôÐÔȴûÎÊÌ⣬ÄÇ Proxy ¾ßÌåÊÇʲô¹íÄØ£¿Æäʵ¾ÍÊÇÕâ¸ö¶«Î÷£º
ºóÃæÒ»´®µÄ¶«Î÷µ½µ×ÓÐʲôÓÃÄØ£¿ÆäʵËüµÄ×÷ÓþÍÊǼǼÐéÄâÊôÐÔ£¬²¢Ð޸ı£´æºÍ¼ÓÔØÖµ£¬ÓÃÒ»¾ä»°¸ÅÀ¨¾ÍÊÇ£ºProxy ÊÇʵÌåÐéÄâÊôÐ﵀ EntityChangeTracker¡£
ÎÒÃÇÒ²¿ÉÒÔÊÖ¶¯½øÐÐÅäÖ㬱ÈÈçͨ¹ýÉèÖà ProxyCreationEnabled È¡Ïû´úÀí£º
public CNBlogsAdDbContext() { Configuration.ProxyCreationEnabled = false; }ÔÙ´ÎÖ´ÐУº
»á·¢ÏÖ AdTextUnit µÄÀàÐÍÉÙÁ˺ܳ¤µÄ¡°Ò»Ûç¶«Î÷¡±£¬ÁíÍ⣬ÐèҪעÒâµÄÊÇ ProxyCreationEnabled ºÍ LazyLoadingEnabled ÓÐËù²»Í¬£¬LazyLoadingEnabled ±íʾÊÇ·ñÆôÓÃÀÁ¼ÓÔØ£¬Ò²¾ÍÊÇÎÒÃÇÔÚ EF ²éѯʵÌåµÄʱºò£¬»á²»»á¼ÓÔØÐéÄâÊôÐÔ£¨µ¼º½ÊôÐÔ£©£¿Èç¹ûÉèÖÃΪ false£¬¾ÍĬÈϲ»ÆôÓÃÀÁ¼ÓÔØ£¬µ«ÎÒÃÇ¿ÉÒÔʹÓà Inculde ½øÐÐÊÖ¶¯¼ÓÔØ£¬µ« ProxyCreationEnabled ±íʾµÄÊÇ×·×Ù£¬ËüºÍ EntityChangeTracker ºÜÀàËÆ£¬Ö»²»¹ý¾ÖÏÞÓÚʵÌåµÄÐéÄâÊôÐÔ¡£
×îºó£¬ÎÒÃÇÔÙÀ´ËµÏÂÕâ¶Î²âÊÔ´úÂ룬Ϊʲô»á±¨´í£¿
[Fact] public void DbContextTest() { var context1 = new CNBlogsAdDbContext(); var context2 = new CNBlogsAdDbContext(); AdTextUnit adTextUnit; adTextUnit = context1.Set<AdTextUnit>().FirstOrDefault(); adTextUnit.DateUpdated = DateTime.Now; context2.Entry<AdTextUnit>(adTextUnit).State = EntityState.Modified; context2.SaveChanges(); }×ܽἸ¸ö¹Ø¼üµã£º
ÉÏÃæÕ⼸¸ö¹Ø¼üµã£¬×îºó¾Íµ¼ÖÂÁ˱¨´í·¢Éú£¬Á˽âÁËÎÒÃÇÉÏÃæµÄ·ÖÎö£¬ÆäʵºÜ¼òµ¥£¬Ê×ÏÈ£¬Í¨¹ý context1 »ñÈ¡ adTextUnit ʵÌå¶ÔÏó£¬ÒòΪÎÒÃÇ¿ªÆôÁË´úÀí£¬ËùÒÔ adTextUnit »á½øÐÐ×·×ÙÆäÄÚ²¿µÄÐéÄâÊôÐÔ£¬²¢ÇÒÕâ¸ö×·×ÙºÍ context1 ÃÜÇÐÏà¹Ø£¬½ÓÏÂÀ´Í¨¹ý context2 ½øÐÐÐ޸ĺͱ£´æ adTextUnit ʵÌ壬ÐèҪעÒâµÄÊÇ£¬ÒòΪÎÒÃÇûÓÐ using context1£¬ËùÒÔÕâʱºò adTextUnit ¶ÔÓ¦µÄ´úÀí×·×Ù»¹ÊÇ´æÔڵģ¬ÓÖÒòΪÎÒÃÇʹÓà context2 Ç¿ÖÆ±íʾ adTextUnit ½øÐÐÁËÐ޸ģ¬context1 ϵĴúÀí×·×Ù£¬ÔõôÄÜÔÚ context2 ½øÐбêÊ¶ÄØ£¿ËùÒÔÕâʱºò¿Ï¶¨»áÅ׳öÒì³££¬Õâ¸öµÀÀíÓÃͨË׵ϰÀ´½²£¬¾ÍÊÇÀÏÀî¼ÒµÄ¶ù×Ó£¬Åܵ½ÀÏÕżҺ°°Ö°Ö£¬Àϼҿ϶¨»á´ò¶ÏËû¶ù×ÓµÄÍÈ¡£
ÕâÆª²©ÎıȽÏÂÒ£¬¶øÇÒÄÚÈݺͱêÌâ¸Ð¾õ²î±ðÒ²±È½Ï´ó£¬µ«Ò»¿ªÊ¼È·ÊµÊÇÓÉ EF DbContext.Configuration.ProxyCreationEnabled Òý·¢µÄ£¬²¢ÇÒÒ»²½Ò»²½²âÊÔ·ÖÎö£¬°ÑÕâ¸ö¹ý³Ì·ÖÏí³öÀ´£¬ÏÖÔڸоõ»¹ÊÇÂùÓмÛÖµµÄ£¬Ò»¸öµã¿ÉÒÔÇ£³öÆäËûºÜ¶àµã£¬¶Ô EF µÄÀí½âºÍʹÓÃÓÖ½øÁËÒ»²½£¬¾Íµ½Õ⣡
²Î¿¼×ÊÁÏ£º
posted @
¡¡