如何覆盖抽象基类的映射

本文关键字:抽象 基类 映射 覆盖 何覆盖 | 更新日期: 2023-09-27 18:08:38

我想为所有Types Of AuditedEntity这样做,但由于我们已经告诉FH忽略基本抽象,代码不会受到影响。我不想为我所有的实体这样做,然后有人忘记当他们添加一个新的typeof<AuditedEntity>

public abstract class AuditedEntity : Entity ...
public class AuditedEntityMappings : IAutoMappingOverride<AuditedEntity>
  {
    public void Override(AutoMapping<AuditedEntity> mapping)
    {
      mapping.Where("DeletedById is null");
    }
  }

这个帖子看起来很有希望,但是这个方法已经被弃用了

如何覆盖抽象基类的映射

在一些相当复杂的表达式上得到了一些帮助,导致了以下扩展:

var model = 
  AutoMap.AssemblyOf<AuditedEntity>(new AutomappingConfiguration(databaseName))
   .HideDeletedEntities();
...
public static class ReflectiveEnumerator
  {
    public static IEnumerable<Type> GetSubTypesOf<T>() where T : class
    {
      return Assembly.GetAssembly(typeof (T)).GetTypes()
        .Where(myType => myType.IsClass && 
          !myType.IsAbstract && 
          myType.IsSubclassOf(typeof (T)));
    }
  }
  public static class AutoPersistenceModelExtensions
  {
    public static AutoPersistenceModel HideDeletedEntities(this AutoPersistenceModel model)
    {
      var types = ReflectiveEnumerator.GetSubTypesOf<AuditedEntity>();
      foreach (var t in types)
      {
        var mapped = typeof(AutoMapping<>).MakeGenericType(t);
        var p = Expression.Parameter(mapped, "m");
        var expression = Expression.Lambda(Expression.GetActionType(mapped),
                                           Expression.Call(p, mapped.GetMethod("Where"),
                                                           Expression.Constant("DeletedById is null")), p);
        typeof(AutoPersistenceModel).GetMethod("Override").MakeGenericMethod(t)
          .Invoke(model, new object[] { expression.Compile() });
      }
      return model;
    }
  }
相关文章: