/// <summary> /// Saves the scope. /// </summary> public void SaveScope(IAuditDbContext context, AuditScope scope, EntityFrameworkEvent @event) { UpdateAuditEvent(@event, context); (scope.Event as AuditEventEntityFramework).EntityFrameworkEvent = @event; context.OnScopeSaving(scope); scope.Save(); }
/// <summary> /// Saves the scope asynchronously. /// </summary> public async Task SaveScopeAsync(IAuditDbContext context, AuditScope scope, EntityFrameworkEvent @event) { UpdateAuditEvent(@event, context); (scope.Event as AuditEventEntityFramework).EntityFrameworkEvent = @event; context.OnScopeSaving(scope); await scope.SaveAsync(); }
/// <summary> /// Creates the Audit scope. /// </summary> private AuditScope CreateAuditScope(EntityFrameworkEvent efEvent) { var typeName = GetType().Name; var eventType = AuditEventType?.Replace("{context}", typeName).Replace("{database}", efEvent.Database) ?? typeName; var scope = AuditScope.Create(eventType, null, EventCreationPolicy.Manual, AuditDataProvider); if (_extraFields != null) { foreach (var field in _extraFields) { scope.SetCustomField(field.Key, field.Value); } } return(scope); }
/// <summary> /// Updates column values and primary keys on the Audit Event after the EF save operation completes. /// </summary> public void UpdateAuditEvent(EntityFrameworkEvent efEvent, IAuditDbContext context) { foreach (var efEntry in efEvent.Entries) { var entry = efEntry.Entry; var entityName = new EntityName() { Schema = efEntry.Schema, Table = efEntry.Table }; efEntry.PrimaryKey = GetPrimaryKey(context.DbContext, entry, entityName); foreach (var pk in efEntry.PrimaryKey) { if (efEntry.ColumnValues.ContainsKey(pk.Key)) { efEntry.ColumnValues[pk.Key] = pk.Value; } } var fks = GetForeignKeys(context.DbContext, entry, entityName); foreach (var fk in fks) { #if EF_FULL // When deleting an entity, sometimes the foreign keys are set to NULL by EF. This only happens on EF6. if (fk.Value == null) { continue; } #endif if (efEntry.ColumnValues.ContainsKey(fk.Key)) { efEntry.ColumnValues[fk.Key] = fk.Value; } } } #if EF_FULL if (efEvent.Associations != null) { foreach (var association in efEvent.Associations) { var e1 = association.Records[0].InternalEntity; var e2 = association.Records[1].InternalEntity; association.Records[0].PrimaryKey = EntityKeyHelper.Instance.GetPrimaryKeyValues(e1, context.DbContext); association.Records[1].PrimaryKey = EntityKeyHelper.Instance.GetPrimaryKeyValues(e2, context.DbContext); } } #endif }
/// <summary> /// Creates the Audit Event. /// </summary> public EntityFrameworkEvent CreateAuditEvent(IAuditDbContext context) { var dbContext = context.DbContext; var modifiedEntries = GetModifiedEntries(context); if (modifiedEntries.Count == 0 && !context.IncludeIndependantAssociations) { return(null); } var clientConnectionId = GetClientConnectionId(dbContext.Database.Connection); var efEvent = new EntityFrameworkEvent() { Entries = new List <EventEntry>(), Database = dbContext.Database.Connection.Database, ConnectionId = clientConnectionId, TransactionId = GetCurrentTransactionId(dbContext, clientConnectionId), DbContext = dbContext, Associations = context.IncludeIndependantAssociations ? GetAssociationEntries(context, context.IncludeEntityObjects) : null }; if (modifiedEntries.Count == 0 && efEvent.Associations == null) { return(null); } foreach (var entry in modifiedEntries) { var entity = entry.Entity; var validationResults = entry.GetValidationResult(); efEvent.Entries.Add(new EventEntry() { Valid = validationResults.IsValid, ValidationResults = validationResults.ValidationErrors.Select(x => x.ErrorMessage).ToList(), Entity = context.IncludeEntityObjects ? entity : null, Entry = entry, Action = GetStateName(entry.State), Changes = entry.State == EntityState.Modified ? GetChanges(dbContext, entry) : null, Table = GetEntityName(dbContext, entity), ColumnValues = GetColumnValues(entry) }); } return(efEvent); }
/// <summary> /// Creates the Audit scope. /// </summary> public AuditScope CreateAuditScope(IAuditDbContext context, EntityFrameworkEvent efEvent) { var typeName = context.GetType().Name; var eventType = context.AuditEventType?.Replace("{context}", typeName).Replace("{database}", efEvent.Database) ?? typeName; var auditEfEvent = new AuditEventEntityFramework(); auditEfEvent.EntityFrameworkEvent = efEvent; var scope = AuditScope.Create(eventType, null, null, EventCreationPolicy.Manual, context.AuditDataProvider, auditEfEvent, 3); if (context.ExtraFields != null) { foreach (var field in context.ExtraFields) { scope.SetCustomField(field.Key, field.Value); } } context.OnScopeCreated(scope); return(scope); }
/// <summary> /// Creates the Audit Event. /// </summary> public EntityFrameworkEvent CreateAuditEvent(IAuditDbContext context) { var dbContext = context.DbContext; var modifiedEntries = GetModifiedEntries(context); if (modifiedEntries.Count == 0) { return(null); } var dbConnection = IsRelational(dbContext) ? dbContext.Database.GetDbConnection() : null; var clientConnectionId = GetClientConnectionId(dbConnection); var efEvent = new EntityFrameworkEvent() { Entries = new List <EventEntry>(), Database = dbConnection?.Database, ConnectionId = clientConnectionId, TransactionId = GetCurrentTransactionId(dbContext, clientConnectionId) }; foreach (var entry in modifiedEntries) { var entity = entry.Entity; var validationResults = DbContextHelper.GetValidationResults(entity); var entityType = dbContext.Model.FindEntityType(entry.Entity.GetType()); efEvent.Entries.Add(new EventEntry() { Valid = validationResults == null, ValidationResults = validationResults?.Select(x => x.ErrorMessage).ToList(), Entity = context.IncludeEntityObjects ? entity : null, Action = DbContextHelper.GetStateName(entry.State), Changes = entry.State == EntityState.Modified ? GetChanges(dbContext, entry) : null, ColumnValues = GetColumnValues(dbContext, entry), PrimaryKey = GetPrimaryKey(entityType, entity), Table = GetEntityName(entityType) }); } return(efEvent); }
/// <summary> /// Updates column values and primary keys on the Audit Event after the EF save operation completes. /// </summary> public void UpdateAuditEvent(EntityFrameworkEvent efEvent, IAuditDbContext context) { foreach (var efEntry in efEvent.Entries) { var entry = efEntry.Entry; efEntry.PrimaryKey = GetPrimaryKey(context.DbContext, entry); foreach (var pk in efEntry.PrimaryKey) { if (efEntry.ColumnValues.ContainsKey(pk.Key)) { efEntry.ColumnValues[pk.Key] = pk.Value; } } var fks = GetForeignKeys(context.DbContext, entry); foreach (var fk in fks) { if (efEntry.ColumnValues.ContainsKey(fk.Key)) { efEntry.ColumnValues[fk.Key] = fk.Value; } } } }
/// <summary> /// Creates the Audit Event. /// </summary> /// <param name="includeEntities">To indicate if it must incluide the serialized entities.</param> /// <param name="mode">The option mode to include/exclude entities from Audit.</param> private EntityFrameworkEvent CreateAuditEvent(bool includeEntities, AuditOptionMode mode) { var modifiedEntries = GetModifiedEntries(mode); if (modifiedEntries.Count == 0) { return(null); } var clientConnectionId = GetClientConnectionId(Database.GetDbConnection()); var efEvent = new EntityFrameworkEvent() { Entries = new List <EventEntry>(), Database = Database.GetDbConnection()?.Database, ConnectionId = clientConnectionId, TransactionId = GetCurrentTransactionId(clientConnectionId) }; foreach (var entry in modifiedEntries) { var entity = entry.Entity; var validationResults = GetValidationResults(entity); var entityType = Model.FindEntityType(entry.Entity.GetType()); efEvent.Entries.Add(new EventEntry() { Valid = validationResults == null, ValidationResults = validationResults?.Select(x => x.ErrorMessage).ToList(), Entity = includeEntities ? entity : null, Action = GetStateName(entry.State), Changes = entry.State == EntityState.Modified ? GetChanges(entry) : null, ColumnValues = GetColumnValues(entry), PrimaryKey = GetPrimaryKey(entityType, entity), Table = GetEntityName(entityType) }); } return(efEvent); }
/// <summary> /// Creates the Audit scope asynchronously. /// </summary> public async Task <IAuditScope> CreateAuditScopeAsync(IAuditDbContext context, EntityFrameworkEvent efEvent) { var typeName = context.GetType().Name; var eventType = context.AuditEventType?.Replace("{context}", typeName).Replace("{database}", efEvent.Database) ?? typeName; var auditEfEvent = new AuditEventEntityFramework { EntityFrameworkEvent = efEvent }; if (context.ExtraFields != null && context.ExtraFields.Count > 0) { auditEfEvent.CustomFields = new Dictionary <string, object>(context.ExtraFields); } var factory = context.AuditScopeFactory ?? Core.Configuration.AuditScopeFactory; var options = new AuditScopeOptions() { EventType = eventType, CreationPolicy = EventCreationPolicy.Manual, DataProvider = context.AuditDataProvider, AuditEvent = auditEfEvent, SkipExtraFrames = 3 }; var scope = await factory.CreateAsync(options); context.OnScopeCreated(scope); return(scope); }
/// <summary> /// Creates the Audit scope asynchronously. /// </summary> public async Task <IAuditScope> CreateAuditScopeAsync(IAuditDbContext context, EntityFrameworkEvent efEvent) { var typeName = context.GetType().Name; var eventType = context.AuditEventType?.Replace("{context}", typeName).Replace("{database}", efEvent.Database) ?? typeName; var auditEfEvent = new AuditEventEntityFramework { EntityFrameworkEvent = efEvent }; var factory = context.AuditScopeFactory ?? Core.Configuration.AuditScopeFactory; var options = new AuditScopeOptions() { EventType = eventType, CreationPolicy = EventCreationPolicy.Manual, DataProvider = context.AuditDataProvider, AuditEvent = auditEfEvent, SkipExtraFrames = 3 }; var scope = await factory.CreateAsync(options); if (context.ExtraFields != null) { foreach (var field in context.ExtraFields) { scope.SetCustomField(field.Key, field.Value); } } context.OnScopeCreated(scope); return(scope); }
/// <summary> /// Saves the scope. /// </summary> private void SaveScope(AuditScope scope, EntityFrameworkEvent @event) { scope.SetCustomField("EntityFrameworkEvent", @event); OnScopeSaving(scope); scope.Save(); }
/// <summary> /// Saves the scope. /// </summary> private void SaveScope(AuditScope scope, EntityFrameworkEvent @event) { (scope.Event as AuditEventEntityFramework).EntityFrameworkEvent = @event; OnScopeSaving(scope); scope.Save(); }