2012-04-30 10 views
27

निम्नलिखित कोड को देखते हुए बदलने के लिए, कैसे करता है एफई/DbContext ग्राहक वस्तु के लिए किए गए परिवर्तन के बारे में जानता है:कैसे इकाई में ट्रैकिंग काम करता है फ्रेमवर्क

class Program 
{ 
    static void Main() 
    { 
     using(var shopContext = new ShopContext()) 
     { 
      var customer = shopContext.Customers.Find(7); 

      customer.City = "Marion"; 

      customer.State = "Indiana"; 

      shopContext.SaveChanges(); 
     } 
    } 
} 

public class ShopContext : DbContext 
{ 
    public DbSet<Customer> Customers { get; set; } 
} 

public class Customer 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
} 

आप

+3

नए रीएडर के लिए, यह ब्लॉग पोस्ट सहायक हो सकता है: http://blog.oneunicorn.com/2012/03/10/secrets-of-detectchanges-part-1-what-does-detectchanges-do/ – Karsten

उत्तर

45

धन्यवाद जब आप इकाई लोड संदर्भ से यह एक अतिरिक्त डेटा संरचना रखता है - आइए इसे एंट्री कहते हैं। प्रविष्टि में मानों के दो सेट होते हैं - मूल मान और वर्तमान मान। जब आप SaveChanges निष्पादन निष्पादित करते हैं तो ईएफ आपके ग्राहक इकाइयों के माध्यम से जाता है और प्रविष्टि में वर्तमान मान अपडेट करता है ताकि वे आपकी इकाई की वास्तविक स्थिति से मेल खाते हों - इस ऑपरेशन को परिवर्तनों का पता लगाने के लिए कहा जाता है। एसक्यूएल कमांड पीढ़ी के दौरान ईएफ वर्तमान और मूल मूल्यों की तुलना करेगा और डेटाबेस में बदले गए मानों को संशोधित करने के लिए एक SQL अद्यतन कथन का निर्माण करेगा। इस ऑपरेशन को स्नैपशॉट परिवर्तन ट्रैकिंग कहा जाता है - ईएफ प्रविष्टि में एक स्नैप शॉट रखता है।

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

+0

हाय , ग्राहक ऑब्जेक्ट के बारे में संदर्भ कैसे जानता है? यह कैसे जुड़ा हुआ/जुड़ा हुआ है? –

+0

संदर्भ इसके बारे में जानता है क्योंकि आपने 'ग्राहक' को कॉल करके ग्राहक ऑब्जेक्ट को उसी संदर्भ उदाहरण के माध्यम से पुनर्प्राप्त किया है। –

+0

यह एक संदर्भ है? –

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