जोड़ने के लिए SaveChanges का उपयोग करके ऑडिट लॉगर जोड़ने के लिए EF में SaveChanges को सीधे ओवरराइड करना लगता है। ऑडिट गुणों (बनाई गई, बनाई गई, अद्यतन, अपडेटेडबी) को सेट करने के लिए ApplyAuditLogging विधि देखें।एंटिटी फ्रेमवर्क 5 ऑडिट लॉग
public override int SaveChanges()
{
var autoDetectChanges = Configuration.AutoDetectChangesEnabled;
try
{
Configuration.AutoDetectChangesEnabled = false;
ChangeTracker.DetectChanges();
var errors = GetValidationErrors().ToList();
if(errors.Any())
{
throw new DbEntityValidationException("Validation errors were found during save: " + errors);
}
foreach (var entry in ChangeTracker.Entries().Where(e => e.State == EntityState.Added || e.State == EntityState.Modified))
{
ApplyAuditLogging(entry);
}
ChangeTracker.DetectChanges();
Configuration.ValidateOnSaveEnabled = false;
return base.SaveChanges();
}
finally
{
Configuration.AutoDetectChangesEnabled = autoDetectChanges;
}
}
private static void ApplyAuditLogging(DbEntityEntry entityEntry)
{
var logger = entityEntry.Entity as IAuditLogger;
if (logger == null) return;
var currentValue = entityEntry.Cast<IAuditLogger>().Property(p => p.Audit).CurrentValue;
if (currentValue == null) currentValue = new Audit();
currentValue.Updated = DateTime.Now;
currentValue.UpdatedBy = "???????????????????????";
if(entityEntry.State == EntityState.Added)
{
currentValue.Created = DateTime.Now;
currentValue.CreatedBy = "????????????????????????";
}
}
समस्या यह है कि कैसे खिड़कियों उपयोगकर्ता लॉगऑन/उपयोगकर्ता नाम वस्तु की UpdatedBy और CreatedBy गुण सेट करने के लिए है? इसलिए मैं इसका उपयोग नहीं कर सका!
इसके अलावा, एक और मामले में मैं अपने संपर्क में स्वचालित रूप से एक नया कॉलहैतिहासिक रिकॉर्ड जोड़ना चाहता था; जब भी संपर्क संशोधित होता है, तो बाल तालिका CallHistory में एक नया रिकॉर्ड जोड़ा जाना चाहिए। तो मैंने इसे रिपोजिटरी के InsertOrUpdate में किया लेकिन यह गंदा लगता है, अगर मैं इसे उच्च स्तर पर कर सकता तो अच्छा होगा क्योंकि अब मुझे वर्तमान उपयोगकर्ता को डेटाबेस से सेट करना होगा। फिर यहां समस्या यह है कि मुझे उपयोगकर्ता को कॉलहाइस्ट्री रिकॉर्ड (SalesRep = उपयोगकर्ता) बनाने के लिए डेटाबेस से लाने की आवश्यकता है।
ContactRepository.SetCurrentUser(User).InsertOrUpdate(contact)
:
मेरी भंडार में कोड अब 2 बातें करता है, 1, यह वस्तु जब यह या बनाया अद्यतन और, 2 है पर एक लेखा परीक्षा प्रवेश बनाई गई, यह भी एक CallHistory प्रवेश जब भी संपर्क अद्यतन किया जाता है बनाया
आदेश के लिए भंडार संदर्भ में उपयोगकर्ता के लिए में:
var prop = typeof(T).GetProperty("Id", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
if (prop.GetValue(entity, null).ToString() == "0")
{
// New entity
_context.Set<T>().Add(entity);
var auditLogger = entity as IAuditLogger;
if (auditLogger != null)
auditLogger.Audit = new Audit(true, _principal.Identity.Name);
}
else
{
// Existing entity
_context.Entry(entity).State = EntityState.Modified;
var auditLogger = entity as IAuditLogger;
if (auditLogger != null && auditLogger.Audit != null)
{
(entity as IAuditLogger).Audit.Updated = DateTime.Now;
(entity as IAuditLogger).Audit.UpdatedBy = _principal.Identity.Name;
}
var contact = entity as Contact;
if (_currentUser != null)
contact.CallHistories.Add(new CallHistory
{
CallTime = DateTime.Now,
Contact = contact,
Created = DateTime.Now,
CreatedBy = _currentUser.Logon,
SalesRep = _currentUser
});
}
}
वहाँ एक रास्ता किसी भी तरह DbContext में SaveChanges ओवरराइड में खिड़कियों उपयोगकर्ता सुई है और वहाँ भी से एक उपयोगकर्ता को लाने के लिए एक रास्ता है विंडोज़ लॉगऑन आईडी पर आधारित डेटाबेस इसलिए मैं साल सेट कर सकता हूं मेरे CallHistory पर esRep (ऊपर कोड देखें)?
यहाँ MVC अनुप्रयोग पर नियंत्रक पर मेरी लड़ाई है:
[HttpPost]
public ActionResult Create([Bind(Prefix = "Contact")]Contact contact, FormCollection collection)
{
SetupVOs(collection, contact, true);
SetupBuyingProcesses(collection, contact, true);
var result = ContactRepository.Validate(contact);
Validate(result);
if (ModelState.IsValid)
{
ContactRepository.SetCurrentUser(User).InsertOrUpdate(contact);
ContactRepository.Save();
return RedirectToAction("Edit", "Contact", new {id = contact.Id});
}
var viewData = LoadContactControllerCreateViewModel(contact);
SetupPrefixDropdown(viewData, contact);
return View(viewData);
}
सैमकाउंटनाम बदलना योग्य नहीं है इसलिए एक अच्छा पहचानकर्ता नहीं है। मैं सक्रिय निर्देशिका guid का उपयोग करता हूं कि सभी वस्तुओं को इसके बजाय मिलता है – meffect