public IEnumerable <DbEntityEntry> PrepareSaveChanges(IAuditableDbContext data, string userName)
        {
            var addedRecords = ApplyAuditInfoRules(data, userName);

            ApplyDeletableEntityRules(data, userName);
            return(addedRecords);
        }
Esempio n. 2
0
        public static void SyncCollections <TEntity>(this IAuditableDbContext auditableContext, IEnumerable <TEntity> sourceCollection, ICollection <TEntity> destinationCollection,
                                                     Action <TEntity, TEntity> updateLogic = null) where TEntity : class, IIdentifiable, new()
        {
            if (sourceCollection == null)
            {
                throw new ArgumentNullException(nameof(sourceCollection));
            }
            else if (destinationCollection == null)
            {
                throw new ArgumentNullException(nameof(destinationCollection));
            }
            else if (auditableContext == null)
            {
                throw new ArgumentNullException(nameof(auditableContext));
            }
            var sourceIds = sourceCollection.Select(t => t.Id).ToArray();
            var destIds   = destinationCollection.Select(t => t.Id).ToArray();

            //Add New Records to destination
            foreach (var dest in sourceCollection.Where(src => !destIds.Contains(src.Id)))
            {
                destinationCollection.Add(dest);
                _ = auditableContext.Add(dest);
            }

            //synchronize removed items
            foreach (var destId in destIds.Where(dstId => !sourceIds.Contains(dstId)))
            {
                var entityFrameworkBoundObject = destinationCollection.First(dst => dst.Id == destId);
                _ = destinationCollection.Remove(entityFrameworkBoundObject);
                _ = auditableContext.Remove(entityFrameworkBoundObject);
            }

            //If update record logic has been provided, run it
            if (updateLogic != null)
            {
                foreach (var srcItem in sourceCollection.Where(src => destIds.Contains(src.Id)))
                {
                    var destItem = destinationCollection.First(dst => dst.Id == srcItem.Id);
                    updateLogic(srcItem, destItem);
                }
            }
            else
            {
                foreach (var srcItem in sourceCollection.Where(src => destIds.Contains(src.Id)))
                {
                    var destItem = destinationCollection.First(dst => dst.Id == srcItem.Id);
                    SimpleMapper <TEntity> .Instance.ApplyChanges(srcItem, destItem);
                }
            }
        }
 private void ApplyDeletableEntityRules(IAuditableDbContext data, string userName)
 {
     foreach (
         var entry in
         data.DbContext.ChangeTracker
         .Entries()
         .Where(e => (e.Entity is IDeletableEntity &&
                      ((e.State == EntityState.Modified) && (((IDeletableEntity)e.Entity)).IsDeleted == true)) ||
                (e.Entity is IDeletableEntity && e.State == EntityState.Deleted)))
     {
         var entity = (IDeletableEntity)entry.Entity;
         data.AuditLogRecords.Add(GetDeletedEntities(entry, userName));
         entity.DeletedFrom = userName;
         entry.State        = EntityState.Modified;
     }
 }
Esempio n. 4
0
        public static void SyncCollections <TSourceEntity, TDestinationEntity>(this IAuditableDbContext auditableContext, IEnumerable <TSourceEntity> sourceCollection, ICollection <TDestinationEntity> destinationCollection,
                                                                               Action <TSourceEntity, TDestinationEntity> updateLogic = null) where TSourceEntity : class, IInsertableDto, new()
            where TDestinationEntity : class, IIdentifiable, new()
        {
            if (sourceCollection == null)
            {
                throw new ArgumentNullException(nameof(sourceCollection));
            }
            else if (destinationCollection == null)
            {
                throw new ArgumentNullException(nameof(destinationCollection));
            }
            else if (auditableContext == null)
            {
                throw new ArgumentNullException(nameof(auditableContext));
            }
            var sourceIds = sourceCollection.Select(t => t.Id).ToArray();
            var destIds   = destinationCollection.Select(t => t.Id).ToArray();

            updateLogic ??= SimpleMapper <TSourceEntity, TDestinationEntity> .Instance.ApplyChanges;
            //Updating Existing records
            foreach (var srcItem in sourceCollection.Where(src => destIds.Any(t => t == src.Id)))
            {
                var destItem = destinationCollection.First(dst => dst.Id == srcItem.Id);
                updateLogic(srcItem, destItem);
            }

            //Create New Records to destination
            foreach (var srcItem in sourceCollection.Where(src => !destIds.Any(t => t == src.Id)))
            {
                var destItem = new TDestinationEntity();
                updateLogic(srcItem, destItem);
                if (srcItem.Id.GetValueOrDefault() != Guid.Empty)
                {
                    destItem.Id = srcItem.Id.Value;
                }
                destinationCollection.Add(destItem);
                _ = auditableContext.Add(destItem);
            }

            //Delete Records from destination
            foreach (var destItem in destinationCollection.Where(src => !sourceIds.Any(t => t == src.Id)))
            {
                _ = destinationCollection.Remove(destItem);
                _ = auditableContext.Remove(destItem);
            }
        }
        private IEnumerable <DbEntityEntry> ApplyAuditInfoRules(IAuditableDbContext data, string userName)
        {
            var addedRecords = new List <DbEntityEntry>();

            // Approach via @julielerman: http://bit.ly/123661P
            foreach (var entry in
                     data.DbContext.ChangeTracker
                     .Entries()
                     .Where(
                         e =>
                         e.Entity is IAuditInfo && ((e.State == EntityState.Added) || (e.State == EntityState.Modified))))
            {
                // Remove deleted entities
                if (entry.Entity.GetType().GetInterface(deletableEntityInterfase) != null &&
                    (((IDeletableEntity)entry.Entity).IsDeleted == true))
                {
                    continue;
                }

                var entity = (IAuditInfo)entry.Entity;
                if (entry.State == EntityState.Added)
                {
                    if (!entity.PreserveCreatedOn)
                    {
                        entity.CreatedOn   = DateTime.Now;
                        entity.CreatedFrom = userName;
                        addedRecords.Add(entry);
                    }
                }
                else
                {
                    GetChangedProperties(entry, userName, data.AuditLogRecords);
                    entity.ModifiedOn   = DateTime.Now;
                    entity.ModifiedFrom = userName;
                }
            }

            return(addedRecords);
        }