|
|
@ -26,8 +26,7 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
|
|
|
|
protected IJsonSerializer JsonSerializer { get; }
|
|
|
|
protected IJsonSerializer JsonSerializer { get; }
|
|
|
|
protected AbpAuditingOptions Options { get; }
|
|
|
|
protected AbpAuditingOptions Options { get; }
|
|
|
|
protected IAuditingHelper AuditingHelper { get; }
|
|
|
|
protected IAuditingHelper AuditingHelper { get; }
|
|
|
|
|
|
|
|
protected IClock Clock{ get; }
|
|
|
|
private readonly IClock _clock;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public EntityHistoryHelper(
|
|
|
|
public EntityHistoryHelper(
|
|
|
|
IAuditingStore auditingStore,
|
|
|
|
IAuditingStore auditingStore,
|
|
|
@ -36,7 +35,7 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
|
|
|
|
IJsonSerializer jsonSerializer,
|
|
|
|
IJsonSerializer jsonSerializer,
|
|
|
|
IAuditingHelper auditingHelper)
|
|
|
|
IAuditingHelper auditingHelper)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_clock = clock;
|
|
|
|
Clock = clock;
|
|
|
|
AuditingStore = auditingStore;
|
|
|
|
AuditingStore = auditingStore;
|
|
|
|
JsonSerializer = jsonSerializer;
|
|
|
|
JsonSerializer = jsonSerializer;
|
|
|
|
AuditingHelper = auditingHelper;
|
|
|
|
AuditingHelper = auditingHelper;
|
|
|
@ -69,7 +68,7 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[CanBeNull]
|
|
|
|
[CanBeNull]
|
|
|
|
private EntityChangeInfo CreateEntityChangeOrNull(EntityEntry entityEntry)
|
|
|
|
protected virtual EntityChangeInfo CreateEntityChangeOrNull(EntityEntry entityEntry)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var entity = entityEntry.Entity;
|
|
|
|
var entity = entityEntry.Entity;
|
|
|
|
|
|
|
|
|
|
|
@ -121,23 +120,23 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
|
|
|
|
return multiTenantEntity.TenantId;
|
|
|
|
return multiTenantEntity.TenantId;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private DateTime GetChangeTime(EntityChangeInfo entityChange)
|
|
|
|
protected virtual DateTime GetChangeTime(EntityChangeInfo entityChange)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var entity = entityChange.EntityEntry.As<EntityEntry>().Entity;
|
|
|
|
var entity = entityChange.EntityEntry.As<EntityEntry>().Entity;
|
|
|
|
switch (entityChange.ChangeType)
|
|
|
|
switch (entityChange.ChangeType)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
case EntityChangeType.Created:
|
|
|
|
case EntityChangeType.Created:
|
|
|
|
return (entity as IHasCreationTime)?.CreationTime ?? _clock.Now;
|
|
|
|
return (entity as IHasCreationTime)?.CreationTime ?? Clock.Now;
|
|
|
|
case EntityChangeType.Deleted:
|
|
|
|
case EntityChangeType.Deleted:
|
|
|
|
return (entity as IHasDeletionTime)?.DeletionTime ?? _clock.Now;
|
|
|
|
return (entity as IHasDeletionTime)?.DeletionTime ?? Clock.Now;
|
|
|
|
case EntityChangeType.Updated:
|
|
|
|
case EntityChangeType.Updated:
|
|
|
|
return (entity as IHasModificationTime)?.LastModificationTime ?? _clock.Now;
|
|
|
|
return (entity as IHasModificationTime)?.LastModificationTime ?? Clock.Now;
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
throw new AbpException($"Unknown {nameof(EntityChangeInfo)}: {entityChange}");
|
|
|
|
throw new AbpException($"Unknown {nameof(EntityChangeInfo)}: {entityChange}");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private string GetEntityId(object entityAsObj)
|
|
|
|
protected virtual string GetEntityId(object entityAsObj)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!(entityAsObj is IEntity entity))
|
|
|
|
if (!(entityAsObj is IEntity entity))
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -156,7 +155,7 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
|
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
/// Gets the property changes for this entry.
|
|
|
|
/// Gets the property changes for this entry.
|
|
|
|
/// </summary>
|
|
|
|
/// </summary>
|
|
|
|
private List<EntityPropertyChangeInfo> GetPropertyChanges(EntityEntry entityEntry)
|
|
|
|
protected virtual List<EntityPropertyChangeInfo> GetPropertyChanges(EntityEntry entityEntry)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var propertyChanges = new List<EntityPropertyChangeInfo>();
|
|
|
|
var propertyChanges = new List<EntityPropertyChangeInfo>();
|
|
|
|
var properties = entityEntry.Metadata.GetProperties();
|
|
|
|
var properties = entityEntry.Metadata.GetProperties();
|
|
|
@ -181,12 +180,12 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
|
|
|
|
return propertyChanges;
|
|
|
|
return propertyChanges;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private bool IsCreated(EntityEntry entityEntry)
|
|
|
|
protected virtual bool IsCreated(EntityEntry entityEntry)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return entityEntry.State == EntityState.Added;
|
|
|
|
return entityEntry.State == EntityState.Added;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private bool IsDeleted(EntityEntry entityEntry)
|
|
|
|
protected virtual bool IsDeleted(EntityEntry entityEntry)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (entityEntry.State == EntityState.Deleted)
|
|
|
|
if (entityEntry.State == EntityState.Deleted)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -197,7 +196,7 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
|
|
|
|
return entity is ISoftDelete && entity.As<ISoftDelete>().IsDeleted;
|
|
|
|
return entity is ISoftDelete && entity.As<ISoftDelete>().IsDeleted;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private bool ShouldSaveEntityHistory(EntityEntry entityEntry, bool defaultValue = false)
|
|
|
|
protected virtual bool ShouldSaveEntityHistory(EntityEntry entityEntry, bool defaultValue = false)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (entityEntry.State == EntityState.Detached ||
|
|
|
|
if (entityEntry.State == EntityState.Detached ||
|
|
|
|
entityEntry.State == EntityState.Unchanged)
|
|
|
|
entityEntry.State == EntityState.Unchanged)
|
|
|
@ -220,7 +219,7 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
|
|
|
|
return defaultValue;
|
|
|
|
return defaultValue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private bool ShouldSavePropertyHistory(PropertyEntry propertyEntry, bool defaultValue)
|
|
|
|
protected virtual bool ShouldSavePropertyHistory(PropertyEntry propertyEntry, bool defaultValue)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (propertyEntry.Metadata.Name == "Id")
|
|
|
|
if (propertyEntry.Metadata.Name == "Id")
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -256,7 +255,7 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
|
|
|
|
return defaultValue;
|
|
|
|
return defaultValue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private bool IsBaseAuditProperty(PropertyInfo propertyInfo, Type entityType)
|
|
|
|
protected virtual bool IsBaseAuditProperty(PropertyInfo propertyInfo, Type entityType)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (entityType.IsAssignableTo<IHasCreationTime>()
|
|
|
|
if (entityType.IsAssignableTo<IHasCreationTime>()
|
|
|
|
&& propertyInfo.Name == nameof(IHasCreationTime.CreationTime))
|
|
|
|
&& propertyInfo.Name == nameof(IHasCreationTime.CreationTime))
|
|
|
@ -312,7 +311,7 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
|
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
/// Updates change time, entity id and foreign keys after SaveChanges is called.
|
|
|
|
/// Updates change time, entity id and foreign keys after SaveChanges is called.
|
|
|
|
/// </summary>
|
|
|
|
/// </summary>
|
|
|
|
public void UpdateChangeList(List<EntityChangeInfo> entityChanges)
|
|
|
|
public virtual void UpdateChangeList(List<EntityChangeInfo> entityChanges)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
foreach (var entityChange in entityChanges)
|
|
|
|
foreach (var entityChange in entityChanges)
|
|
|
|
{
|
|
|
|
{
|
|
|
|