Created
November 19, 2015 20:56
-
-
Save strvmarv/8608cec472e088f68a92 to your computer and use it in GitHub Desktop.
Partial ObjectContext Auditing Example using SaveChanges hiding and ObjectStateManager
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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