Example #1
0
        public static ModelBuilder ApplyAuditableConfiguration(this ModelBuilder builder, Action <AuditableConfigurationOptions> configureOptions)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            var options = new AuditableConfigurationOptions();

            configureOptions?.Invoke(options);

            foreach (var entityType in builder.GetEntityTypes(typeof(IAuditable), x => !typeof(ValueObject <>).IsAssignableFromGenericType(x.ClrType)))
            {
                var entityClrType = entityType.ClrType;

                builder.Entity(entityClrType, entityTypeBuilder =>
                {
                    if (typeof(ICreatable).IsAssignableFrom(entityClrType))
                    {
                        entityTypeBuilder.Property(AuditableProperties.DateCreated)
                        .IsRequired(true);
                        if (typeof(ISignedCreatable).IsAssignableFrom(entityClrType))
                        {
                            entityTypeBuilder.Property(AuditableProperties.CreatedBy)
                            .IsRequired(options.SignedColumnIsRequired)
                            .HasMaxLength(options.SignedColumnMaxLength);
                        }
                    }

                    if (typeof(IModifiable).IsAssignableFrom(entityClrType))
                    {
                        entityTypeBuilder.Property(AuditableProperties.DateModified)
                        .IsRequired(true);
                        if (typeof(ISignedModifiable).IsAssignableFrom(entityClrType))
                        {
                            entityTypeBuilder.Property(AuditableProperties.ModifiedBy)
                            .IsRequired(options.SignedColumnIsRequired)
                            .HasMaxLength(options.SignedColumnMaxLength);
                        }
                    }

                    if (typeof(ISoftDeletable).IsAssignableFrom(entityClrType))
                    {
                        entityTypeBuilder.Property(AuditableProperties.DateDeleted)
                        .IsRequired(false);
                        entityTypeBuilder.HasSoftDeletableQueryFilter(entityClrType);

                        if (typeof(ISignedSoftDeletable).IsAssignableFrom(entityClrType))
                        {
                            entityTypeBuilder.Property(AuditableProperties.DeletedBy)
                            .IsRequired(options.SignedColumnIsRequired)
                            .HasMaxLength(options.SignedColumnMaxLength);
                        }
                    }
                });
            }

            return(builder);
        }
        public static DbModelBuilder ApplyAuditableConfiguration(this DbModelBuilder builder, Action <AuditableConfigurationOptions> configureOptions)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            var options = new AuditableConfigurationOptions();

            configureOptions?.Invoke(options);

            builder.Types().Where(x => typeof(IAuditable).IsAssignableFrom(x)).Configure(x =>
            {
                var entityClrType = x.ClrType;

                if (typeof(ICreatable).IsAssignableFrom(entityClrType))
                {
                    x.Property(AuditableProperties.DateCreated)
                    .IsRequired();
                    if (typeof(ISignedCreatable).IsAssignableFrom(entityClrType))
                    {
                        x.Property(AuditableProperties.CreatedBy)
                        .IsRequired(options.SignedColumnIsRequired)
                        .HasMaxLength(options.SignedColumnMaxLength);
                    }
                }

                if (typeof(IModifiable).IsAssignableFrom(entityClrType))
                {
                    x.Property(AuditableProperties.DateModified)
                    .IsRequired(true);
                    if (typeof(ISignedModifiable).IsAssignableFrom(entityClrType))
                    {
                        x.Property(AuditableProperties.ModifiedBy)
                        .IsRequired(options.SignedColumnIsRequired)
                        .HasMaxLength(options.SignedColumnMaxLength);
                    }
                }

                if (typeof(ISoftDeletable).IsAssignableFrom(entityClrType))
                {
                    x.Property(AuditableProperties.DateDeleted)
                    .IsRequired(false);
                    if (typeof(ISignedSoftDeletable).IsAssignableFrom(entityClrType))
                    {
                        x.Property(AuditableProperties.DeletedBy)
                        .IsRequired(options.SignedColumnIsRequired)
                        .HasMaxLength(options.SignedColumnMaxLength);
                    }
                }
            });

            builder.Filter(options.SoftDeletableFilterName, (ISoftDeletable entity) => entity.DateDeleted, null);

            return(builder);
        }