internal static ModelBuilder MapAuditR(this ModelBuilder modelBuilder, AuditRConfiguration auditRConfiguration)
        {
            modelBuilder.Entity <AuditEntry>(b =>
            {
                b.Property(c => c.CorrelationId).IsRequired();
                b.Property(c => c.DateCreated).IsRequired();
                b.Property(c => c.EntityData).IsRequired();
                b.Property(c => c.EntityKey).HasMaxLength(128).IsRequired();
                b.Property(c => c.Id).IsRequired();
                b.Property(c => c.EntityName).HasMaxLength(128).IsRequired();
                b.Property(c => c.TableName).HasMaxLength(128).IsRequired();
                b.Property(c => c.UserId).HasMaxLength(38).IsRequired();
                b.Property(c => c.UserName).HasMaxLength(128).IsRequired();
                b.Property(c => c.IPAddress).HasMaxLength(45).IsRequired();
                b.Property(c => c.OperationType).HasColumnType("int").IsRequired()
                .HasConversion(v => (int)v, v => (OperationType)Enum.Parse(typeof(OperationType), v.ToString()));
            });

            modelBuilder.Entity <AuditEntry>().HasIndex(w => new { w.CorrelationId, w.EntityKey, w.UserId });
            modelBuilder.Entity <AuditEntry>().ToTable(auditRConfiguration.AuditEntryTableName, auditRConfiguration.Schema);

            modelBuilder.Entity <AuditEntryProperty>(b =>
            {
                b.Property(c => c.NewValue).IsRequired();
                b.Property(c => c.OldValue).IsRequired();
                b.Property(c => c.PropertyName).IsRequired();
            });
            modelBuilder.Entity <AuditEntryProperty>().ToTable(auditRConfiguration.AuditEntryPropertyTableName, auditRConfiguration.Schema);

            modelBuilder.Entity <AuditEntry>().HasMany(m => m.AuditEntryProperties).WithOne(m => m.AuditEntry).IsRequired();
            return(modelBuilder);
        }
        public void Db_Update_Audit(FakeDbModel fakeDbModel)
        {
            var connection = new SqliteConnection("DataSource=:memory:");

            connection.Open();

            var options = new DbContextOptionsBuilder <FakeAuditRDbContext>()
                          .UseSqlite(connection)
                          .Options;

            try
            {
                var config = new AuditRConfiguration(addChangesetWhenInsert: false);
                using (var context = new FakeAuditRDbContext(() => _auditUser, config, options))
                {
                    context.Database.EnsureCreated();
                }

                using (var context = new FakeAuditRDbContext(() => _auditUser, config, options))
                {
                    context.FakeDbModels.Add(fakeDbModel);
                    context.SaveChanges();
                    fakeDbModel.Name = "test_data";
                    context.SaveChanges();
                }

                using (var context = new FakeAuditRDbContext(() => _auditUser, config, options))
                {
                    Assert.True(context.FakeDbModels.Any());
                    Assert.True(context.AuditEntryProperties.Count() == 1);
                    Assert.True(context.AuditEntries.Count() == 2);
                }
            }
            finally
            {
                connection.Close();
            }
        }
 public FakeAuditRDbContext(Func <AuditUser> auditUserFunc, AuditRConfiguration auditRConfiguration, DbContextOptions options)
     : base(auditUserFunc, auditRConfiguration, options)
 {
 }
        public static IServiceCollection AddAuditR(this IServiceCollection services, Func <AuditUser> funcCurrentUser, AuditRConfiguration auditRConfiguration)
        {
            if (funcCurrentUser == null)
            {
                throw new ArgumentNullException(nameof(funcCurrentUser));
            }

            if (auditRConfiguration == null)
            {
                throw new ArgumentNullException(nameof(auditRConfiguration));
            }

            services.AddScoped((s) => funcCurrentUser);
            services.AddSingleton(auditRConfiguration);
            return(services);
        }