Skip to content

Instantly share code, notes, and snippets.

@strvmarv
Created November 19, 2015 20:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save strvmarv/8608cec472e088f68a92 to your computer and use it in GitHub Desktop.
Save strvmarv/8608cec472e088f68a92 to your computer and use it in GitHub Desktop.
Partial ObjectContext Auditing Example using SaveChanges hiding and ObjectStateManager
public partial class YourEntities
{
public bool AuditAutoUserAndDateBypass { get; set; }
public bool AuditBypass { get; set; }
public string AuditProcess { get; set; }
public string AuditSource { get; set; }
public int AuditUser { get; set; }
partial void OnContextCreated()
{
this.AuditAutoUserAndDateBypass = false;
this.AuditBypass = false;
if (this.AuditSource == null) this.AuditSource = "No Source";
if (this.AuditProcess == null) this.AuditProcess = "No Process";
}
public new int SaveChanges()
{
var r = 0;
this.DetectChanges();
var auditList = new List<AuditLog>();
// ComplexTypes
var relations = this.ObjectStateManager.GetObjectStateEntries(~EntityState.Detached).Where(e => e.IsRelationship);
foreach (var entry in relations)
{
if (AuditAutoUserAndDateBypass) continue;
var fieldsMetaData = entry.CurrentValues.DataRecordInfo.FieldMetadata;
#region CreatedBy
var createdUser = fieldsMetaData.FirstOrDefault(f => f.FieldType.Name == "CreatedBy");
if (createdUser.FieldType != null)
{
string fieldTypeName = createdUser.FieldType.TypeUsage.EdmType.Name;
if (fieldTypeName == PrimitiveTypeKind.Int32.ToString())
{
entry.CurrentValues.SetInt32(createdUser.Ordinal, this.AuditUser);
}
}
#endregion CreatedBy
#region CreatedDate
var createdDate = fieldsMetaData.FirstOrDefault(f => f.FieldType.Name == "CreatedDate");
if (createdDate.FieldType != null)
{
string fieldTypeName = createdDate.FieldType.TypeUsage.EdmType.Name;
if (fieldTypeName == PrimitiveTypeKind.DateTime.ToString())
{
entry.CurrentValues.SetDateTime(createdDate.Ordinal, DateTime.Now);
}
}
#endregion CreatedDate
#region ActiveFlag
var activeFlag = fieldsMetaData.FirstOrDefault(f => f.FieldType.Name == "ActiveFlag");
if (activeFlag.FieldType != null)
{
string fieldTypeName = activeFlag.FieldType.TypeUsage.EdmType.Name;
if (fieldTypeName == PrimitiveTypeKind.Boolean.ToString())
{
entry.CurrentValues.SetBoolean(activeFlag.Ordinal, true);
}
}
#endregion ActiveFlag
}
// Inserts
var added = this.ObjectStateManager.GetObjectStateEntries(EntityState.Added);
foreach (var entry in added)
{
if (AuditAutoUserAndDateBypass) continue;
var fieldsMetaData = entry.CurrentValues.DataRecordInfo.FieldMetadata;
#region CreatedBy
var createdUser = fieldsMetaData.FirstOrDefault(f => f.FieldType.Name == "CreatedBy");
if (createdUser.FieldType != null)
{
string fieldTypeName = createdUser.FieldType.TypeUsage.EdmType.Name;
if (fieldTypeName == PrimitiveTypeKind.Int32.ToString())
{
entry.CurrentValues.SetInt32(createdUser.Ordinal, this.AuditUser);
}
}
#endregion CreatedBy
#region CreatedDate
var createdDate = fieldsMetaData.FirstOrDefault(f => f.FieldType.Name == "CreatedDate");
if (createdDate.FieldType != null)
{
string fieldTypeName = createdDate.FieldType.TypeUsage.EdmType.Name;
if (fieldTypeName == PrimitiveTypeKind.DateTime.ToString())
{
entry.CurrentValues.SetDateTime(createdDate.Ordinal, DateTime.Now);
}
}
#endregion CreatedDate
#region ActiveFlag
var activeFlag = fieldsMetaData.FirstOrDefault(f => f.FieldType.Name == "ActiveFlag");
if (activeFlag.FieldType != null)
{
string fieldTypeName = activeFlag.FieldType.TypeUsage.EdmType.Name;
if (fieldTypeName == PrimitiveTypeKind.Boolean.ToString())
{
entry.CurrentValues.SetBoolean(activeFlag.Ordinal, true);
}
}
#endregion ActiveFlag
}
// Deletes
var deleted = this.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted);
foreach (var entry in deleted)
{
if (!IsAuditable(entry)) continue;
var list = AuditObject.AuditObjectDeletedFactory(entry, this.AuditUser, this.AuditSource, this.AuditProcess);
auditList.AddRange(list.Select(ToAuditLog));
}
// Updates
var modified = this.ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
foreach (var entry in modified)
{
if (!AuditAutoUserAndDateBypass)
{
var fieldsMetaData = entry.CurrentValues.DataRecordInfo.FieldMetadata;
#region ModifiedBy
var modifiedUser = fieldsMetaData.FirstOrDefault(f => f.FieldType.Name == "ModifiedBy");
if (modifiedUser.FieldType != null)
{
string fieldTypeName = modifiedUser.FieldType.TypeUsage.EdmType.Name;
if (fieldTypeName == PrimitiveTypeKind.Int32.ToString())
{
entry.CurrentValues.SetInt32(modifiedUser.Ordinal, this.AuditUser);
}
}
#endregion ModifiedBy
#region ModifiedDate
var modifiedDate = fieldsMetaData.FirstOrDefault(f => f.FieldType.Name == "ModifiedDate");
if (modifiedDate.FieldType != null)
{
string fieldTypeName = modifiedDate.FieldType.TypeUsage.EdmType.Name;
if (fieldTypeName == PrimitiveTypeKind.DateTime.ToString())
{
entry.CurrentValues.SetDateTime(modifiedDate.Ordinal, DateTime.Now);
}
}
#endregion ModifiedDate
}
if (IsAuditable(entry))
{
var list = AuditObject.AuditObjectModifiedFactory(entry, this.AuditUser, this.AuditSource, this.AuditProcess);
auditList.AddRange(list.Select(ToAuditLog));
}
}
if (auditList.Count > 0 && !AuditBypass)
{
auditList.ForEach(c => this.AuditLogs.AddObject(c));
}
r = base.SaveChanges();
// Get Identity Keys for Added
if (r > 0)
{
var count = 0;
foreach (var entry in added)
{
if (!IsAuditable(entry) || AuditBypass) continue;
var add = AuditObject.AuditObjectAddedFactory(entry, this.AuditUser, this.AuditSource, this.AuditProcess);
if (add == null) continue;
var a = ToAuditLog(add);
this.AuditLogs.AddObject(a);
count++;
}
if (count > 0)
{
r = r + base.SaveChanges();
}
}
return r;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment