예제 #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 override int SaveChanges(bool acceptAllChangesOnSuccess)
        {
            ProccessChangeTrackerResult proccessChangeTrackerResult = ChangeTrackerAuditService.ProccessChangeTracker(ChangeTracker, _auditOptions);
            AuditSubjectData            auditSubjectData            = _auditSubjectDataService.Get();

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

            Audit.AddRange(auditEntities);

            return(base.SaveChanges());
        }
예제 #3
0
        public async override Task <int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default)
        {
            ProccessChangeTrackerResult proccessChangeTrackerResult = await ChangeTrackerAuditService.ProccessChangeTrackerAsync(ChangeTracker, _auditOptions);

            AuditSubjectData auditSubjectData = _auditSubjectDataService.Get();

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

            Audit.AddRange(auditEntities);

            return(await base.SaveChangesAsync());
        }
예제 #4
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());
            }
        }