2017-03-21 8 views
5

से इसकी मान को कैसे ढूंढें I SaveChange() विधि को ओवरराइड कर रहा हूं। मैं जो चाहता हूं वह है कि "एबीसी अपडेटेड नाम जॉन टू डू, ..." आदि जैसे सरल टेक्स्ट में किसी भी इकाई में किए गए सभी परिवर्तनों को लॉग इन करना, 0 आदि। मैंने कार्यक्षमता हासिल की है लेकिन जब किसी इकाई में एक विदेशी कुंजी है देश_आईडी की तरह अपडेट करें जो तालिका को इंगित करता है देश यह "एबीसी अपडेटेड देश_आईडी 1 से 3, ..." जैसे पाठ उत्पन्न करता है, जो मैं नहीं चाहता कि यह "एबीसी अपडेटेड कनाडा कनाडा से ऑस्ट्रेलिया, ..."सी # लेखापरीक्षा SaveChanges() विधि ओवरराइडिंग। किसी इकाई की विदेशी कुंजी और तालिका

तो इस लक्ष्य को हासिल करने के लिए यह विदेशी कुंजी और अपने मूल्य

मेरे कोड है पता होना चाहिए:

public override int SaveChanges() 
    { 
     List<string> listChanges = new List<string>(); 
     List<string> listTable = new List<string>(); 

     var objectStateManager = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager; 
     IEnumerable<ObjectStateEntry> changes = 
      objectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Added | EntityState.Deleted); 


     foreach (ObjectStateEntry stateEntryEntity in changes) 
     { 

      var modifiedProperties = stateEntryEntity.GetModifiedProperties(); 
      foreach (var propName in modifiedProperties) 
      { 
       if (Convert.ToString(stateEntryEntity.OriginalValues[propName]) != Convert.ToString(stateEntryEntity.CurrentValues[propName])) 
       { 
        listTable.Add(stateEntryEntity.EntityKey.EntitySetName); 
        listChanges.Add(propName + " From " + Convert.ToString(stateEntryEntity.OriginalValues[propName]) + " to " + Convert.ToString(stateEntryEntity.CurrentValues[propName])); 

       } 


       //System.Console.WriteLine("Property {0} changed from {1} to {2}", 
       //  propName, 
       //  stateEntryEntity.OriginalValues[propName], 
       //  stateEntryEntity.CurrentValues[propName]); 
      } 
     } 
     return base.SaveChanges(); 
    } 
+0

एक परियोजना यहाँ है कि आप इकाई की रूपरेखा द्वारा किए गए परिवर्तनों को ऑडिट करने की अनुमति देता है है है अपनी प्रविष्टि निर्दिष्ट कर सकते हैं , नए और पुराने मूल्य इत्यादि। मुझे आश्चर्य है कि अगर वहां कोई भी कोड आपको प्राप्त करने में मदद कर सकता है। https://github.com/bilal-fazlani/tracker-enabled-dbcontext आपको मिली समस्या यह है कि अक्सर इस तरह के रिश्तों, एक विदेशी कुंजी, एक पूरी पंक्ति के आईडी की पहचान करता है, ताकि आप ' कनाडा से ऑस्ट्रेलिया 'विशेष रूप से कॉलम नाम निर्दिष्ट किए बिना ... जब तक आप किसी प्रकार का सम्मेलन अपनाते नहीं हैं। – Luke

उत्तर

0

पुनः प्राप्त करने के लिए एक विशेषता है, मैंने ट्रैक परिवर्तन और लॉग के लिए चेंजट्रैकर का उपयोग किया। आपको अपने संदर्भ का निपटान करने से पहले हर बदलाव मिलते हैं, इसलिए संक्षेप में आप इस तरह बना सकते हैं;

public override int SaveChanges() 
     { 
      foreach (var history in ChangeTracker.Entries() 
       .Where(e => e.Entity is IModificationHistory && (e.State == EntityState.Added || 
                   e.State == EntityState.Modified)) 
       .Select(e => e.Entity as IModificationHistory) 
      ) 
      { 
       history.DateModified = DateTime.Now; 
       if (history.DateCreated == DateTime.MinValue) 
        history.DateCreated = DateTime.Now; 
      } 
      var result = base.SaveChanges(); 
      foreach (var history in ChangeTracker.Entries() 
       .Where(e => e.Entity is IModificationHistory) 
       .Select(e => e.Entity as IModificationHistory) 
      ) 
       history.IsDirty = false; 
      return result; 
     } 

इसके अलावा, आप सही से पहले base.savechanges()

यह मेरा इतिहास इंटरफ़ेस

public interface IModificationHistory 
    { 
     DateTime DateModified { get; set; } 
     DateTime DateCreated { get; set; } 
     bool IsDirty { get; set; } 
    } 
संबंधित मुद्दे