Пример #1
0
        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());
                }
            }
        }