public async override Task <int> SaveChangesAsync() { using (var tx = this.CreateTransactionScope()) { ChangeSet cs = this.PrepareChanges(); if (!(SecurityContext == null || SecurityContext.IgnoreSecurity)) { foreach (var item in cs.UpdatedEntities) { BaseSecurityContext.GenericMethods.InvokeGeneric( SecurityContext, "VerifyEntityModify", item.EntityType, item.Entity, item.OriginalValues.Keys.ToList()); } foreach (var item in cs.Deleted) { await(Task) GenericMethods.InvokeGeneric(this, "VerifySourceEntity", item.EntityType, item.Entity, true); } } if (AuditContext != null) { cs.BeginAudit(); } try { int result = await base.SaveChangesAsync(); if (!(SecurityContext == null || SecurityContext.IgnoreSecurity)) { foreach (var item in cs.UpdatedEntities) { await(Task) GenericMethods.InvokeGeneric(this, "VerifySourceEntity", item.EntityType, item.Entity, false); } } if (AuditContext != null) { await cs.EndAuditAsync(AuditContext); } tx.Commit(); return(result); } catch (DbEntityValidationException ve) { StringBuilder sb = new StringBuilder(); foreach (var item in ve.EntityValidationErrors.Where(x => !x.IsValid)) { foreach (var error in item.ValidationErrors) { sb.AppendLine(item.Entry.Entity.GetType() + "." + error.PropertyName + ": " + error.ErrorMessage); } } throw new AtomValidationException(sb.ToString()); } } }