private void GetEntryValueInString(ObjectStateEntry entry, bool isOrginal, ref DocumentAudit auditEntity) { PropertyInfo[] entityProperties = auditEntity.GetType().GetProperties().Where(p => p.PropertyType != typeof(EntityCollection <>) && p.PropertyType != typeof(EntityState) && p.PropertyType != typeof(EntityKey) && p.PropertyType != typeof(EntityObject) && p.PropertyType != typeof(EntityReference) && p.PropertyType.FullName != "System.Object").ToArray(); foreach (string propName in entry.GetModifiedProperties()) { if (propName == "Id") { continue; } // object setterValue = null; var prop = entityProperties.FirstOrDefault(p => p.Name.ToLower() == propName.ToLower()); if (prop != null) { var currentValue = entry.CurrentValues[propName]; var orignalValue = auditEntity.GetType().GetProperty(propName).GetValue(auditEntity, null); //.OriginalValues[propName]; if (!object.ReferenceEquals(currentValue, orignalValue)) //currentValue.Equals(orignalValue)) { if (currentValue == DBNull.Value) { currentValue = null; } PropertyInfo propInfo = auditEntity.GetType().GetProperty(propName); propInfo.SetValue(auditEntity, currentValue, null); } } }//end foreach }
//partial void OnContextCreated() //{ // ((IObjectContextAdapter)this).ObjectContext.SavingChanges += new EventHandler(SCMSEntities_SavingChanges); //} void SCMSEntities_SavingChanges(object sender, EventArgs e) { IEnumerable <ObjectStateEntry> changes = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified); foreach (ObjectStateEntry stateEntryEntity in changes) { if (!this.EntityIsAuditable((EntityObject)stateEntryEntity.Entity)) { continue; } if (stateEntryEntity.State == EntityState.Modified | stateEntryEntity.State == EntityState.Deleted) { Guid auditId = new Guid(GetEntryValueInString(stateEntryEntity, stateEntryEntity.State == EntityState.Modified ? false : true, "Id")); if (this.DocumentAudits.FirstOrDefault(p => p.DocumentId == auditId) == null) { continue; } } if (!stateEntryEntity.IsRelationship && stateEntryEntity.Entity != null && !(stateEntryEntity.Entity is DocumentAudit)) {//is a normal entry, not a relationship DocumentAudit audit = this.AuditTrailFactory(stateEntryEntity, UserName); //DBAudit audit = this.AuditTrailFactory(stateEntryEntity, UserName); switch (stateEntryEntity.State) { case EntityState.Added: //auditTrailList.Add(audit); this.DocumentAudits.Add(audit); break; case EntityState.Deleted: this.DocumentAudits.Remove(audit); break; case EntityState.Detached: break; case EntityState.Modified: ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.ChangeObjectState(audit, System.Data.EntityState.Modified); break; case EntityState.Unchanged: break; default: break; } } } //if (auditTrailList.Count > 0) //{ // foreach (var audit in auditTrailList) // {//add all audits // this.AddToDocumentAudits(audit); // //this.AddToDBAudits(audit); // } //} }
private DocumentAudit AuditTrailFactory(ObjectStateEntry entry, string UserName) { DocumentAudit auditEntity; string countprog, authorizedBy, authorizedOn, IsApproved, IsVerified, AprovedOn, IsAuthorized, IsRejected, IsReviewed, IsSubmited, PreparedBy, PreparedOn, ReviewedBy, ReviewedOn, VerifiedBy, ApprovedBy, ApprovedOn; //DBAudit audit = new DBAudit(); if (entry.State == EntityState.Added) {//entry is Added GetProperyValue(entry, out countprog, out authorizedBy, out authorizedOn, out IsApproved, out IsVerified, out AprovedOn, out IsAuthorized, out IsRejected, out IsReviewed, out IsSubmited, out PreparedBy, out PreparedOn, out ReviewedBy, out ReviewedOn, out ApprovedBy, out ApprovedOn, out VerifiedBy); auditEntity = new DocumentAudit(); auditEntity.CountryProgrammeId = countprog.Equals(string.Empty) ? Guid.Empty : new Guid(countprog); auditEntity.Id = Guid.NewGuid(); auditEntity.IssueDate = DateTime.Now; auditEntity.DocumentId = new Guid(GetEntryValueInString(entry, false, "Id")); auditEntity.PreparedBy = PreparedBy == string.Empty ? (Guid?)null : new Guid(PreparedBy); auditEntity.ApprovedBy = ApprovedBy == string.Empty ? (Guid?)null : new Guid(ApprovedBy); auditEntity.PreparedOn = PreparedOn == string.Empty ? (DateTime?)null : DateTime.Parse(PreparedOn); auditEntity.DocumentType = entry.EntitySet.Name; auditEntity.AuthorizedBy = authorizedBy == string.Empty ? (Guid?)null : new Guid(authorizedBy); auditEntity.AuthorizedOn = authorizedOn == string.Empty ? (DateTime?)null : DateTime.Parse(authorizedOn); auditEntity.IsApproved = IsApproved == string.Empty ? (bool?)null : bool.Parse(IsApproved); auditEntity.IsAprovedOn = AprovedOn == string.Empty ? (DateTime?)null : DateTime.Parse(AprovedOn); auditEntity.IsAuthorized = IsAuthorized == string.Empty ? (bool?)null : bool.Parse(IsAuthorized); auditEntity.IsRejected = IsRejected == string.Empty ? (bool?)null : bool.Parse(IsRejected); auditEntity.IsReviewed = IsReviewed == string.Empty ? (bool?)null : bool.Parse(IsReviewed); auditEntity.IsSubmitted = IsSubmited == string.Empty ? (bool?)null : bool.Parse(IsSubmited); auditEntity.ReviewedBy = ReviewedBy == string.Empty ? (Guid?)null : new Guid(ReviewedBy); auditEntity.ReviewedOn = ReviewedOn == string.Empty ? (DateTime?)null : DateTime.Parse(ReviewedOn); auditEntity.IsVerified = IsVerified == string.Empty ? (bool?)null : bool.Parse(IsVerified); auditEntity.VerifiedBy = VerifiedBy == string.Empty ? (Guid?)null : new Guid(VerifiedBy); } else if (entry.State == EntityState.Deleted) {//entry in deleted auditEntity = new DocumentAudit(); Guid auditId = new Guid(GetEntryValueInString(entry, true, "Id")); auditEntity = this.DocumentAudits.FirstOrDefault(p => p.DocumentId == auditId); } else {//entry is modified auditEntity = new DocumentAudit(); Guid auditId = new Guid(GetEntryValueInString(entry, false, "Id")); auditEntity = this.DocumentAudits.FirstOrDefault(p => p.DocumentId == auditId); GetEntryValueInString(entry, false, ref auditEntity); } return(auditEntity);// audit; }