@@ -22,6 +22,21 @@ public override ValueTask<InterceptionResult<int>> SavingChangesAsync(DbContextE
2222 return base . SavingChangesAsync ( eventData , result , cancellationToken ) ;
2323 }
2424
25+ public override int SavedChanges ( SaveChangesCompletedEventData eventData , int result )
26+ {
27+ PostSaveChanges ( ) . GetAwaiter ( ) . GetResult ( ) ;
28+ var savedChanges = base . SavedChanges ( eventData , result ) ;
29+ return savedChanges ;
30+ }
31+
32+ public override async ValueTask < int > SavedChangesAsync ( SaveChangesCompletedEventData eventData , int result ,
33+ CancellationToken cancellationToken = default )
34+ {
35+ await PostSaveChanges ( ) ;
36+ var savedChanges = await base . SavedChangesAsync ( eventData , result , cancellationToken ) ;
37+ return savedChanges ;
38+ }
39+
2540 private void PreSaveChanges ( DbContext dbContext )
2641 {
2742 if ( ! AuditConfig . Options . AuditEnabled )
@@ -60,52 +75,54 @@ private async Task PostSaveChanges()
6075 {
6176 if ( AuditEntries is { Count : > 0 } )
6277 {
78+ var now = DateTimeOffset . Now ;
79+
6380 var auditUserIdProvider = AuditConfig . Options . UserIdProviderFactory ? . Invoke ( serviceProvider ) ;
81+ var auditUser = auditUserIdProvider ? . GetUserId ( ) ;
82+ var enrichers = serviceProvider . GetServices < IAuditPropertyEnricher > ( ) . ToArray ( ) ;
6483
6584 foreach ( var entry in AuditEntries )
6685 {
67- if ( entry is InternalAuditEntry auditEntry )
86+ // update TemporaryProperties
87+ if ( entry is InternalAuditEntry { TemporaryProperties . Count : > 0 } auditEntry )
6888 {
69- // update TemporaryProperties
70- if ( auditEntry . TemporaryProperties is { Count : > 0 } )
89+ foreach ( var temporaryProperty in auditEntry . TemporaryProperties )
7190 {
72- foreach ( var temporaryProperty in auditEntry . TemporaryProperties )
91+ var colName = temporaryProperty . GetColumnName ( ) ;
92+ if ( temporaryProperty . Metadata . IsPrimaryKey ( ) )
93+ {
94+ auditEntry . KeyValues [ colName ] = temporaryProperty . CurrentValue ;
95+ }
96+
97+ switch ( auditEntry . OperationType )
7398 {
74- var colName = temporaryProperty . GetColumnName ( ) ;
75- if ( temporaryProperty . Metadata . IsPrimaryKey ( ) )
76- {
77- auditEntry . KeyValues [ colName ] = temporaryProperty . CurrentValue ;
78- }
79-
80- switch ( auditEntry . OperationType )
81- {
82- case DataOperationType . Add :
83- auditEntry . NewValues ! [ colName ] = temporaryProperty . CurrentValue ;
84- break ;
85-
86- case DataOperationType . Delete :
87- auditEntry . OriginalValues ! [ colName ] = temporaryProperty . OriginalValue ;
88- break ;
89-
90- case DataOperationType . Update :
91- auditEntry . OriginalValues ! [ colName ] = temporaryProperty . OriginalValue ;
92- auditEntry . NewValues ! [ colName ] = temporaryProperty . CurrentValue ;
93- break ;
94- }
99+ case DataOperationType . Add :
100+ auditEntry . NewValues ! [ colName ] = temporaryProperty . CurrentValue ;
101+ break ;
102+
103+ case DataOperationType . Delete :
104+ auditEntry . OriginalValues ! [ colName ] = temporaryProperty . OriginalValue ;
105+ break ;
106+
107+ case DataOperationType . Update :
108+ auditEntry . OriginalValues ! [ colName ] = temporaryProperty . OriginalValue ;
109+ auditEntry . NewValues ! [ colName ] = temporaryProperty . CurrentValue ;
110+ break ;
95111 }
96- // set to null
97- auditEntry . TemporaryProperties = null ;
98112 }
113+
114+ // set TemporaryProperties to null
115+ auditEntry . TemporaryProperties = null ;
99116 }
100117
101118 // apply enricher
102- foreach ( var enricher in AuditConfig . Options . Enrichers )
119+ foreach ( var enricher in enrichers )
103120 {
104121 enricher . Enrich ( entry ) ;
105122 }
106123
107- entry . UpdatedAt = DateTimeOffset . UtcNow ;
108- entry . UpdatedBy = auditUserIdProvider ? . GetUserId ( ) ;
124+ entry . UpdatedBy = auditUser ;
125+ entry . UpdatedAt = now ;
109126 }
110127
111128 await Task . WhenAll (
@@ -114,17 +131,4 @@ await Task.WhenAll(
114131 ) ;
115132 }
116133 }
117-
118- public override int SavedChanges ( SaveChangesCompletedEventData eventData , int result )
119- {
120- PostSaveChanges ( ) . GetAwaiter ( ) . GetResult ( ) ;
121- return base . SavedChanges ( eventData , result ) ;
122- }
123-
124- public override async ValueTask < int > SavedChangesAsync ( SaveChangesCompletedEventData eventData , int result ,
125- CancellationToken cancellationToken = new CancellationToken ( ) )
126- {
127- await PostSaveChanges ( ) ;
128- return await base . SavedChangesAsync ( eventData , result , cancellationToken ) ;
129- }
130134}
0 commit comments