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); }