2016-11-15 7 views
8

मैं क्या पढ़ा है से, ProxyCreationEnabled = false की स्थापना परिवर्तन ट्रैकिंग और आलसी लोड हो रहा है नहीं कर पाएगा। हालांकि, मैं स्पष्ट रूप से परिवर्तन ट्रैकिंग कवर पर स्पष्ट नहीं हूं।अक्षम इकाई की रूपरेखा प्रॉक्सी निर्माण

अगर मैं उसे निष्क्रिय और डेटाबेस से एक इकाई मिलता है, उसमें परिवर्तन कर और प्रतिबद्ध, फिर उन परिवर्तनों को सहेजा जाता है। मैं भी अभी भी ChangeTracker से संशोधित प्रविष्टियों प्राप्त करने में सक्षम हूँ:

ChangeTracker.Entries<IAuditable>().Where(x => x.State == EntityState.Modified).ToList() 

इस जब मैं विकलांग प्रॉक्सी निर्माण किया है संभव हो सकता है? मैं इसे अक्षम करना चाहता हूं, लेकिन मैं जो अक्षम कर रहा हूं उस पर स्पष्ट होना चाहता हूं।

उत्तर

5

पर नज़र रखने और प्रॉक्सी निर्माण बदलें दो विभिन्न परिदृश्यों है। यदि आपको परिवर्तन ट्रैकिंग को अक्षम करने की आवश्यकता है तो आपको नीचे दिखाए गए अनुसार इसे करना होगा।

public class YourContext : DbContext 
{ 
    public YourContext() 
    { 
     this.Configuration.AutoDetectChangesEnabled = false; 
    } 
} 

तब आप यह ChangeTracker.Entries<IAuditable>().Where(x => x.State == EntityState.Modified).ToList() नहीं कर सकते हैं।

आप प्रॉक्सी निर्माण को निष्क्रिय करने की जरूरत है तो आप अपने संदर्भ के निर्माता पर यह करने के लिए के रूप में नीचे देख सकते हैं।

public class YourContext : DbContext 
{ 
    public YourContext() 
    { 
     this.Configuration.ProxyCreationEnabled = false; 
    } 

    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
} 

प्रॉक्सी निर्माण तंत्र का उपयोग संबंधों की आलसी लोडिंग का समर्थन करने के लिए किया जाता है। ईएफ उन प्रकारों के लिए प्रॉक्सी नहीं बनाएगा जहां प्रॉक्सी करने के लिए कुछ भी नहीं है। दूसरे शब्दों में आप अपने POCO वर्गों पर virtual गुण नहीं है, तो फिर कोई प्रभाव नहीं होता या तो आप इसे अक्षम या नहीं किया है।

आप अपनी संस्थाओं serializing रहे हैं, तो प्रॉक्सी deserializing मुश्किल हो सकता है के बाद से प्रॉक्सी और आलसी लोड हो रहा है बंद पर विचार करें।

आप यहाँ इसके बारे में अधिक पढ़ सकते हैं: Entity Framework Working with Proxies

9

मैं पुष्टि कर सकता एफई में गलत पर ProxyCreationEnabled की स्थापना करता है कि नहीं ट्रैकिंग बदलें प्रभावित करते हैं। आपने वास्तव में मुझे इस सवाल से चिंतित किया क्योंकि मैंने सोचा कि मुझे जवाब पता था, लेकिन पुष्टि करने के लिए मैंने एक त्वरित परीक्षण केस बनाया था।

namespace EFCTTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var context = new MyContext(); 
      context.Tests.First().Test = "Edited"; 

      var models = context.ChangeTracker.Entries<TestModel>().Where(x => x.State == EntityState.Modified).ToList(); 
      foreach(var model in models) 
       Console.WriteLine($"From {model.OriginalValues["Test"]} to {model.CurrentValues["Test"]}"); 

      Console.ReadLine(); 
     } 
    } 

    public class MyContext : DbContext 
    { 
     public MyContext() 
     { 
      Configuration.ProxyCreationEnabled = false; 
     } 

     public DbSet<TestModel> Tests { get; set; } 
    } 

    public class TestModel 
    { 
     public int Id { get; set; } 
     public string Test { get; set; } 
    } 
} 

केवल एक चीज है कि प्रॉक्सी पीढ़ी को अक्षम करने प्रभावित करना चाहिए एफई के आलसी लोड हो रहा है कार्यक्षमता जब आप उपयोग कर रहे हैं एक और मॉडल को virtual नेविगेशन गुण है:

उदाहरण कोड है कि एक वैध परिदृश्य का प्रतिनिधित्व करता है नीचे देखें। चेंज ट्रैकर स्वतंत्र है और अंतर्निहित ObjectContext से ही काम करता है।

ट्रैकिंग परिवर्तन से संबंधित एक पूरा जवाब के लिए, यह शायद यह देखते हुए कि AutoDetectChangesEnabled केवल सेटिंग है, जो सीधे परिवर्तन पर नज़र रखने की कार्यक्षमता को प्रभावित करती है, अगर आप अपने नमूना कोड का उपयोग करने के लिए आवश्यक DetectChanges() कॉल करने के लिए आप की आवश्यकता होती है प्रतीत होता है लायक है।

संबंधित मुद्दे