public static void PrepareAddDefault(this IFullAuditableDbContext dbContext, object entity)
 {
     if (entity is IAuditableEntity auditableEntity)
     {
         auditableEntity.CreatedTime = DateTimeOffset.UtcNow;
     }
 }
        public static void AuditEntitiesDefault(this IFullAuditableDbContext dbContext)
        {
            var hasChanges = dbContext.ChangeTracker.HasChanges();

            if (!hasChanges)
            {
                return;
            }

            var entries = dbContext.ChangeTracker.Entries()
                          .Where(o => o.State == EntityState.Modified ||
                                 o.State == EntityState.Added).ToArray();

            foreach (var entry in entries)
            {
                var entity = entry.Entity;

                switch (entry.State)
                {
                case EntityState.Modified:
                    dbContext.PrepareModify(entity);
                    break;

                case EntityState.Added:
                    dbContext.PrepareAdd(entity);
                    break;
                }
            }
        }
示例#3
0
        public static void PrepareModifyDefault(this IFullAuditableDbContext dbContext, object entity)
        {
            var isSoftDeleted = false;

            if (entity is ISoftDeleteEntity)
            {
                var softDeleteEntity = entity as ISoftDeleteEntity;

                if (softDeleteEntity.IsDeleted)
                {
                    if (softDeleteEntity.DeletedTime != null)
                    {
                        throw new InvalidOperationException($"{nameof(entity)} is already deleted");
                    }

                    softDeleteEntity.DeletedTime = Time.Now;
                    isSoftDeleted = true;
                }
            }

            if (isSoftDeleted || entity is IAuditableEntity == false)
            {
                return;
            }

            var auditableEntity = entity as IAuditableEntity;

            auditableEntity.LastModifiedTime = Time.Now;
        }
        public static async Task <EntityEntry <E> > ReloadAsyncDefault <E>(this IFullAuditableDbContext dbContext, E entity) where E : class
        {
            var entry = dbContext.Entry(entity);

            await entry.ReloadAsync();

            return(entry);
        }
        public static EntityEntry <E> RemoveDefault <E>(this IFullAuditableDbContext dbContext, E entity, bool isPhysical) where E : class
        {
            if (isPhysical)
            {
                return(dbContext.Remove(entity));
            }

            return(dbContext.SoftDelete(entity));
        }
        public static void RemoveRangeDefault <E>(this IFullAuditableDbContext dbContext, IEnumerable <E> list, bool isPhysical) where E : class
        {
            if (isPhysical)
            {
                dbContext.RemoveRange(list);
                return;
            }

            dbContext.SoftDeleteRange(list);
        }
示例#7
0
        public static void PrepareAddDefault(this IFullAuditableDbContext dbContext, object entity)
        {
            if (entity is IAuditableEntity == false)
            {
                return;
            }

            var auditableEntity = entity as IAuditableEntity;

            auditableEntity.CreatedTime = Time.Now;
        }
        public static bool TryAttachDefault(this IFullAuditableDbContext dbContext, object entity, out EntityEntry entry)
        {
            entry = dbContext.Entry(entity);

            if (entry.State == EntityState.Detached)
            {
                entry = dbContext.Attach(entity);

                return(true);
            }

            return(false);
        }
        public static bool TryAttachDefault <T>(this IFullAuditableDbContext dbContext, T entity, out EntityEntry <T> entry)
            where T : class
        {
            entry = dbContext.Entry(entity);

            if (entry.State == EntityState.Detached)
            {
                entry = dbContext.Attach(entity);

                return(true);
            }

            return(false);
        }
示例#10
0
        public static EntityEntry SoftDeleteDefault(this IFullAuditableDbContext dbContext, object entity)
        {
            if (entity is ISoftDeleteEntity softDeleteEntity)
            {
                softDeleteEntity.IsDeleted = true;

                var entry = dbContext.Entry(entity);
                entry.Property(nameof(softDeleteEntity.IsDeleted)).IsModified = true;

                return(entry);
            }

            throw new InvalidOperationException($"{nameof(entity)} is not {nameof(ISoftDeleteEntity)}");
        }
示例#11
0
        public static async Task <EntityEntry <E> > RemoveAsyncDefault <E>(this IFullAuditableDbContext dbContext, object[] key, bool isPhysical) where E : class
        {
            var entity = await dbContext.FindAsync <E>(key);

            if (entity == null)
            {
                throw new KeyNotFoundException();
            }

            if (isPhysical)
            {
                return(dbContext.Remove(entity));
            }

            return(dbContext.SoftDelete(entity));
        }
示例#12
0
        public static IQueryable <T> QueryDeletedDefault <T>(this IFullAuditableDbContext dbContext) where T : class, ISoftDeleteEntity
        {
            var eType = typeof(T);

            if (dbContext.IsSoftDeleteAppliedForEntity(eType))
            {
                var clonedFilter = dbContext.GetClonedFilter(QueryFilterConsts.SoftDeleteDefaultName);

                var oldFilter = clonedFilter.ApplyFilter;
                clonedFilter.ApplyFilter = o => oldFilter(o) && o != eType;

                dbContext.ReplaceOrAddFilter(clonedFilter);
            }

            return(dbContext.Set <T>().IsDeleted());
        }
示例#13
0
        public static EntityEntry SoftRemoveDefault(this IFullAuditableDbContext dbContext, object entity)
        {
            if (entity is ISoftDeleteEntity == false)
            {
                throw new InvalidOperationException($"{nameof(entity)} is not {nameof(ISoftDeleteEntity)}");
            }

            var softDeleteEntity = entity as ISoftDeleteEntity;

            softDeleteEntity.IsDeleted = true;

            var entry = dbContext.Entry(entity);

            entry.State = EntityState.Modified;

            return(entry);
        }
示例#14
0
        public static void PrepareModifyDefault(this IFullAuditableDbContext dbContext, object entity)
        {
            var isSoftDeleted = false;

            if (entity is ISoftDeleteEntity softDeleteEntity)
            {
                if (softDeleteEntity.IsDeleted)
                {
                    if (softDeleteEntity.DeletedTime != null)
                    {
                        throw new InvalidOperationException($"{nameof(entity)} is already deleted");
                    }

                    softDeleteEntity.DeletedTime = DateTimeOffset.UtcNow;
                    isSoftDeleted = true;
                }
            }

            if (!isSoftDeleted && entity is IAuditableEntity auditableEntity)
            {
                auditableEntity.LastModifiedTime = DateTimeOffset.UtcNow;
            }
        }
示例#15
0
 public static Task <int> SqlRemoveAllAsyncDefault(this IFullAuditableDbContext dbContext, string tblName)
 {
     return(dbContext.Database.ExecuteSqlInterpolatedAsync($"DELETE FROM {tblName}"));
 }