C# Fluent NHibernate如何重写抽象基类的映射
我想对我所有类型的AuditedEntity都这样做,但正如我们告诉FH忽略基本摘要一样,代码没有受到影响。我不想对我所有的实体都这样做,然后让某人忘记他们添加了一种新类型的,看起来很有希望的,但该方法已被弃用了由于在一些相当复杂的表达式上提供了一些帮助,使其能够工作,从而导致了以下扩展:C# Fluent NHibernate如何重写抽象基类的映射,c#,abstract-class,fluent-nhibernate-mapping,C#,Abstract Class,Fluent Nhibernate Mapping,我想对我所有类型的AuditedEntity都这样做,但正如我们告诉FH忽略基本摘要一样,代码没有受到影响。我不想对我所有的实体都这样做,然后让某人忘记他们添加了一种新类型的,看起来很有希望的,但该方法已被弃用了由于在一些相当复杂的表达式上提供了一些帮助,使其能够工作,从而导致了以下扩展: var model = AutoMap.AssemblyOf<AuditedEntity>(new AutomappingConfiguration(databaseName)) .H
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;
}
}
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;
}
}