示例#1
0
        public override int SaveChanges()
        {
            SoftDelete();
            AddTimestampInfo();

            ProccessChangeTrackerResult proccessChangeTrackerResult = ChangeTrackerAuditService.ProccessChangeTracker(ChangeTracker);

            if (proccessChangeTrackerResult.RequiresCustomBatch)
            {
                using (IDbContextTransaction dbTransaction = Database.BeginTransaction())
                {
                    try
                    {
                        int changes = base.SaveChanges();

                        AuditSubjectData auditSubjectData = _auditDataService.Get();

                        IEnumerable <AuditEntity> auditEntities = proccessChangeTrackerResult.AuditObjectData
                                                                  .Select(x => new AuditEntity(
                                                                              auditObjectData: x,
                                                                              auditSubjectData: auditSubjectData));

                        Audit.AddRange(auditEntities);

                        int auditChanges = base.SaveChanges();

                        dbTransaction.Commit();

                        return(changes);
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError(ex, $"Failed to perform db transaction");

                        dbTransaction.Rollback();

                        throw;
                    }
                }
            }
            else
            {
                AuditSubjectData auditSubjectData = _auditDataService.Get();

                IEnumerable <AuditEntity> auditEntities = proccessChangeTrackerResult.AuditObjectData
                                                          .Select(x => new AuditEntity(
                                                                      auditObjectData: x,
                                                                      auditSubjectData: auditSubjectData));

                Audit.AddRange(auditEntities);

                return(base.SaveChanges() - auditEntities.Count());
            }
        }
示例#2
0
        public async override Task <int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
        {
            SoftDelete();
            AddTimestampInfo();

            ProccessChangeTrackerResult proccessChangeTrackerResult = ChangeTrackerAuditService.ProccessChangeTracker(ChangeTracker);

            if (proccessChangeTrackerResult.RequiresCustomBatch)
            {
                using (IDbContextTransaction dbTransaction = await Database.BeginTransactionAsync(cancellationToken))
                {
                    try
                    {
                        int changes = base.SaveChanges();

                        AuditSubjectData auditSubjectData = _auditDataService.Get();

                        IEnumerable <AuditEntity> auditEntities = proccessChangeTrackerResult.AuditObjectData
                                                                  .Select(x => new AuditEntity(
                                                                              auditObjectData: x,
                                                                              auditSubjectData: auditSubjectData));

                        Audit.AddRange(auditEntities);

                        int auditChanges = await base.SaveChangesAsync(cancellationToken);

#if NET_CORE2
                        dbTransaction.Commit();
#elif NET_CORE3
                        await dbTransaction.CommitAsync(cancellationToken);
#endif
                        return(changes);
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError(ex, $"Failed to perform db transaction");

#if NET_CORE2
                        dbTransaction.Rollback();
#elif NET_CORE3
                        await dbTransaction.RollbackAsync(cancellationToken);
#endif

                        throw;
                    }
                }
            }
            else
            {
                AuditSubjectData auditSubjectData = _auditDataService.Get();

                IEnumerable <AuditEntity> auditEntities = proccessChangeTrackerResult.AuditObjectData
                                                          .Select(x => new AuditEntity(
                                                                      auditObjectData: x,
                                                                      auditSubjectData: auditSubjectData));

                Audit.AddRange(auditEntities);

                int changes = await base.SaveChangesAsync(cancellationToken);

                return(changes - auditEntities.Count());
            }
        }