/// <summary> /// Updates change time, entity id and foreign keys after SaveChanges is called. /// </summary> private void UpdateChangeSet(EntityChangeSet changeSet) { foreach (var entityChange in changeSet.EntityChanges) { /* Update change time */ entityChange.ChangeTime = GetChangeTime(entityChange); /* Update entity id */ var entityEntry = entityChange.EntityEntry.As <EntityEntry>(); entityChange.EntityId = GetEntityId(entityEntry.Entity); /* Update foreign keys */ var foreignKeys = entityEntry.Metadata.GetForeignKeys(); foreach (var foreignKey in foreignKeys) { foreach (var property in foreignKey.Properties) { var propertyEntry = entityEntry.Property(property.Name); var propertyChange = entityChange.PropertyChanges.FirstOrDefault(pc => pc.PropertyName == property.Name); if (propertyChange == null) { if (!(propertyEntry.OriginalValue?.Equals(propertyEntry.CurrentValue) ?? propertyEntry.CurrentValue == null)) { // Add foreign key entityChange.PropertyChanges.Add(new EntityPropertyChange { NewValue = propertyEntry.CurrentValue.ToJsonString(), OriginalValue = propertyEntry.OriginalValue.ToJsonString(), PropertyName = property.Name, PropertyTypeFullName = property.ClrType.FullName }); } continue; } if (propertyChange.OriginalValue == propertyChange.NewValue) { var newValue = propertyEntry.CurrentValue.ToJsonString(); if (newValue == propertyChange.NewValue) { // No change entityChange.PropertyChanges.Remove(propertyChange); } else { // Update foreign key propertyChange.NewValue = newValue.TruncateWithPostfix(EntityPropertyChange.MaxValueLength); } } } } } }
public virtual async Task SaveAsync(EntityChangeSet changeSet) { if (!IsEntityHistoryEnabled) { return; } if (changeSet.EntityChanges.Count == 0) { return; } UpdateChangeSet(changeSet); using (var uow = _unitOfWorkManager.Begin(TransactionScopeOption.Suppress)) { await EntityHistoryStore.SaveAsync(changeSet); await uow.CompleteAsync(); } }
public virtual EntityChangeSet CreateEntityChangeSet(ICollection <EntityEntry> entityEntries) { var changeSet = new EntityChangeSet { Reason = EntityChangeSetReasonProvider.Reason.TruncateWithPostfix(EntityChangeSet.MaxReasonLength), // Fill "who did this change" BrowserInfo = ClientInfoProvider.BrowserInfo.TruncateWithPostfix(EntityChangeSet.MaxBrowserInfoLength), ClientIpAddress = ClientInfoProvider.ClientIpAddress.TruncateWithPostfix(EntityChangeSet.MaxClientIpAddressLength), ClientName = ClientInfoProvider.ComputerName.TruncateWithPostfix(EntityChangeSet.MaxClientNameLength), ImpersonatorTenantId = CodeZeroSession.ImpersonatorTenantId, ImpersonatorUserId = CodeZeroSession.ImpersonatorUserId, TenantId = CodeZeroSession.TenantId, UserId = CodeZeroSession.UserId }; if (!IsEntityHistoryEnabled) { return(changeSet); } foreach (var entry in entityEntries) { if (!ShouldSaveEntityHistory(entry)) { continue; } var entityChange = CreateEntityChange(entry); if (entityChange == null) { continue; } changeSet.EntityChanges.Add(entityChange); } return(changeSet); }
public static void Save(this IEntityHistoryHelper entityHistoryHelper, EntityChangeSet changeSet) { AsyncHelper.RunSync(() => entityHistoryHelper.SaveAsync(changeSet)); }
public virtual Task SaveAsync(EntityChangeSet changeSet) { return(_changeSetRepository.InsertAsync(changeSet)); }
public Task SaveAsync(EntityChangeSet entityChangeSet) { return(Task.CompletedTask); }