public IEnumerable <DbEntityEntry> PrepareSaveChanges(IAuditableDbContext data, string userName) { var addedRecords = ApplyAuditInfoRules(data, userName); ApplyDeletableEntityRules(data, userName); return(addedRecords); }
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; } }
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); }