I have an windows service which processes input from xml files. I need to insert new records and update the existing records every time I get a new file. I now need to implement insert\update history every time after an operation has occurred. I am required to maintain this in a separate table by displaying old value and new value. Is there any existing methodologies or techniques available for implementing this in easier way i.e something like comparing two objects and identifying modified fields. Please provide any suggestions. I am using Entityframework 5.0 and sql 2012.
Insert\Update - object values history maintenance in ObjectContext
393 views Asked by Darey AtThere are 3 answers
There are multiple ways to do this.
Using interceptors of your persistence API framework. For eg JPA or Hibernate framework provides facade around your entity operations which runs after DML operations in database.
Event Listeners: You should be able to create event listeners inside your persistence framework which will be triggered and insert history data in your history tables after each DML operation.
Database triggers: This is indeed one of the most simplest way of maintaining history information for a given row/table.
Hope these pointers help Anant
My Entity class was derived from ObjectContext
, which did not provide ChangeTracker
for obtaining the modified values. However, for ObjectContext
, we can obtain the modified values using DBContext.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)
You can use EntityState.Deleted
, EntityState.Added
if required.
The below is the sample Implementation
Entities DBContext = new Entities();
var d = DBContext.StudentTableName.Where(x => x.stname == "Stock").FirstOrDefault();
if(d!= null)
{
d.Id = "345";
DBContext.StudentTableName.ApplyCurrentValues(d);
//Need to Include Audit Logging before save, or can override save function.
var entrList = DBContext.ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
foreach (var stateEntry in entrList)
{
var currentValues = stateEntry.CurrentValues;
var originalValues = stateEntry.OriginalValues;
var modifiedProperties = stateEntry.GetModifiedProperties();
foreach (string modifiedProperty in modifiedProperties)
{
var currentValue = currentValues.GetValue(currentValues.GetOrdinal(modifiedProperty));
var originalValue = originalValues.GetValue(originalValues.GetOrdinal(modifiedProperty));
if (!originalValue.Equals(currentValue))
{
//Perform the logging operation
}
}
}
// Audit Logging Performed
DBContext.SaveChanges();
}
Specifically for EF, you can override
DbContext.SaveChanges()
and iterate overDbContext.ChangeTracker.Entries()
. Each entry contains the current and original values for the properties of the entity.