Ejemplo n.º 1
0
 /// <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();
 }
Ejemplo n.º 2
0
 /// <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();
 }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
        /// <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
        }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
        /// <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);
        }
Ejemplo n.º 7
0
        /// <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);
        }
Ejemplo n.º 8
0
 /// <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;
             }
         }
     }
 }
Ejemplo n.º 9
0
        /// <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);
        }
Ejemplo n.º 10
0
        /// <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);
        }
Ejemplo n.º 11
0
        /// <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);
        }
Ejemplo n.º 12
0
 /// <summary>
 /// Saves the scope.
 /// </summary>
 private void SaveScope(AuditScope scope, EntityFrameworkEvent @event)
 {
     scope.SetCustomField("EntityFrameworkEvent", @event);
     OnScopeSaving(scope);
     scope.Save();
 }
Ejemplo n.º 13
0
 /// <summary>
 /// Saves the scope.
 /// </summary>
 private void SaveScope(AuditScope scope, EntityFrameworkEvent @event)
 {
     (scope.Event as AuditEventEntityFramework).EntityFrameworkEvent = @event;
     OnScopeSaving(scope);
     scope.Save();
 }