दिलचस्प पोस्ट
MySQL, Grails 2 ऐप के लिए लंबे समय तक निष्क्रियता के दौरान पूल किए गए कनेक्शन को जीवित रखने का सही तरीका (या उनका समय और उन्हें ताज़ा करना) MySQL – पिछली पंक्ति से मूल्य घटाकर समूह JqGrid में सभी पंक्तियां कैसे दिखाएं? यदि ब्राउज़र इंटरनेट एक्सप्लोरर है: इसके बजाय एक वैकल्पिक स्क्रिप्ट चलाएं Mysqldump का उपयोग किए बिना प्रतिलिपि / डुप्लिकेट डेटाबेस VueJs 2 के साथ वैश्विक डेटा गिट में एक फ़ाइल की कॉपी संशोधनों को वापस लाएं? कॉमा ऑपरेटर का उचित उपयोग क्या है? किसी सूची में डुप्लिकेट को पहचानें स्वयंसेवा एपीआई उद्देश्य सी मैं जावा में सामान्य सूची कैसे क्लोन करता हूं? Javax.preistence.Table.indexes में NoSuchMethodError () [Ljavax / दृढ़ता / सूचकांक पहले से चल रहे जेवीएम को संलग्न करना सेलेनियम में पेज लोड की प्रतीक्षा करें पाठ-संरेखित केंद्र का उपयोग कर केंद्र छवि?

एमवीसी और संस्था ढांचा के साथ लेखापरीक्षा लॉग / परिवर्तन इतिहास कार्यान्वित करना

मैं एक चेंज हिस्ट्री / ऑडिट लॉग में अपने एमवीसी ऐप का निर्माण कर रहा हूं जो इकाई फ़्रेमवर्क का उपयोग कर रहा है

तो विशेष रूप से संपादन विधि में public ActionResult Edit(ViewModel vm) , हम जिस ऑब्जेक्ट को हम अपडेट करने का प्रयास कर रहे हैं, उसे TryUpdateModel(object) , और उसके बाद प्रपत्र से मान TryUpdateModel(object) को स्थानांतरित करने के लिए TryUpdateModel(object) का उपयोग करें जिसे हम अपडेट करने का प्रयास कर रहे हैं।

जब किसी ऑब्जेक्ट के किसी भी क्षेत्र में परिवर्तन होता है तो मैं एक परिवर्तन लॉग इन करना चाहता हूं। तो मूल रूप से मुझे क्या चाहिए ऑब्जेक्ट की प्रतिलिपि है इससे पहले इसे संपादित किया जाता है और फिर TryUpdateModel(object) ने इसके काम के बाद इसकी तुलना की है अर्थात

 [HttpPost] public ActionResult Edit(ViewModel vm) { //Need to take the copy here var object = EntityFramework.Object.Single(x=>x.ID = vm.ID); if (ModelState.IsValid) { //Form the un edited view model var uneditedVM = BuildViewModel(vm.ID); //this line seems to confuse the EntityFramework (BuildViewModel() is used to build the model when originally displaying the form) //Compare with old view model WriteChanges(uneditedVM, vm); ... TryUpdateModel(object); } ... } 

लेकिन समस्या तब होती है जब कोड "अप्रकाशित वीएम" को प्राप्त करता है, यह EntityFramework में कुछ अप्रत्याशित परिवर्तन पैदा कर रहा है – ताकि TryUpdateModel(object); एक UpdateException फेंकता है

तो सवाल यह है कि – इस परिस्थिति में – मैं object के इतिहास के लिए तुलना करने के लिए एंटिटीफ़्रेमवर्क के बाहर object की प्रतिलिपि कैसे बनाऊं, जिससे कि यह EntityFramework को प्रभावित या बदल न करे

संपादित करें: ट्रिगर्स का उपयोग नहीं करना चाहते उस यूजरनेम को लॉग ऑन करने की आवश्यकता है

edit1: EFv4 का उपयोग करना, यह भी नहीं है कि कैसे सहेजने वाले SaveChanges() बारे में जाना, लेकिन यह एक विकल्प हो सकता है


यह मार्ग इस तरह की एक सरल आवश्यकता के लिए कहीं नहीं जा रहा है! आखिरकार इसे ठीक से ओवरराइड करने के लिए मिल गया, लेकिन अब मुझे उस कोड के साथ अपवाद मिलता है:

 public partial class Entities { public override int SaveChanges(SaveOptions options) { DetectChanges(); var modifiedEntities = ObjectStateManager.GetObjectStateEntries(EntityState.Modified); foreach (var entry in modifiedEntities) { var modifiedProps = ObjectStateManager.GetObjectStateEntry(entry).GetModifiedProperties(); //This line throws exception The ObjectStateManager does not contain an ObjectStateEntry with a reference to an object of type 'System.Data.Objects.EntityEntry'. var currentValues = ObjectStateManager.GetObjectStateEntry(entry).CurrentValues; foreach (var propName in modifiedProps) { var newValue = currentValues[propName]; //log changes } } //return base.SaveChanges(); return base.SaveChanges(options); } } 

Solutions Collecting From Web of "एमवीसी और संस्था ढांचा के साथ लेखापरीक्षा लॉग / परिवर्तन इतिहास कार्यान्वित करना"

यदि आप ईएफ 4 का उपयोग कर रहे हैं तो आप SavingChanges ईवेंट की सदस्यता ले सकते हैं।

चूंकि Entities आंशिक श्रेणी हैं इसलिए आप एक अलग फ़ाइल में अतिरिक्त कार्यक्षमता जोड़ सकते हैं। इसलिए Entities नाम की एक नई फ़ाइल बनाएं और ईवेंट को हुक करने के लिए OnContextCreated आंशिक विधि को कार्यान्वित करें

 public partial class Entities { partial void OnContextCreated() { SavingChanges += OnSavingChanges; } void OnSavingChanges(object sender, EventArgs e) { var modifiedEntities = ObjectStateManager.GetObjectStateEntries(EntityState.Modified); foreach (var entry in modifiedEntities) { var modifiedProps = ObjectStateManager.GetObjectStateEntry(entry.EntityKey).GetModifiedProperties(); var currentValues = ObjectStateManager.GetObjectStateEntry(entry.EntityKey).CurrentValues; foreach (var propName in modifiedProps) { var newValue = currentValues[propName]; //log changes } } } } 

यदि आप ईएफ 4.1 का उपयोग कर रहे हैं तो आप परिवर्तनों को निकालने के लिए इस लेख के माध्यम से जा सकते हैं

FrameLog देखें, एक इकाई फ़्रेमवर्क लॉगिंग लायब्रेरी जिसे मैंने इस प्रयोजन के लिए लिखा था। यह खुला स्रोत है, जिसमें व्यावसायिक उपयोग शामिल है

मुझे पता है कि आपको यह देखना होगा कि यह कैसे करना है, लेकिन एक कोड स्निपेट को देखना होगा, लेकिन लॉगिंग के लिए सभी मामलों को ठीक तरह से व्यवस्थित करने के लिए, रिश्ते में परिवर्तन और कई-से-कई परिवर्तनों सहित, कोड बहुत बड़ा हो जाता है उम्मीद है कि लाइब्रेरी आपकी आवश्यकताओं के लिए एक अच्छी फिट होगी, लेकिन यदि आप कोड को स्वतंत्र रूप से अनुकूलित नहीं कर सकते हैं

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

कोड प्रोजेक्ट में उच्च रेटिंग वाला एक लेख है: इकाई फ़्रेमवर्क का उपयोग करते हुए ऑडिट ट्रेल कार्यान्वित करना । ऐसा लगता है कि आप क्या चाहते हैं मैंने एक प्रोजेक्ट में इस समाधान का उपयोग करना शुरू कर दिया है। मैंने पहली बार टी-एसक्यूएल में डाटाबेस में ट्रिगर किया था लेकिन हर समय होने वाले ऑब्जेक्ट मॉडल में बदलाव के साथ उन्हें बनाए रखना बहुत कठिन था