2012-03-09 38 views
3

我有我的所有实体类型的基类,这是像地图通用EntityBase <TEntity>类FluentNHibernate

public abstract class EntityBase<TEntityType> : IEntityBase where TEntityType : EntityBase<TEntityType> 
    { 
     private List<IBusinessRule> _brokenRules = new List<IBusinessRule>(); 

     private int? _hashCode; 

     public int ID { private set; get; } 

,并在我的映射我想使用表每类策略,但如何映射这个EntityBase类?我尝试了公共类EntityBaseMap:ClassMap,但它不起作用。 那么我怎么能映射这个类?我为什么要这样做的原因是我不想用Id(c=c.ID).Not.Null ....等写出重复的东西,但它在一个映射类。

我的映射类这个样子的

public class EntityBaseMap : ClassMap<EntityBase<???>> 

我应该插入的,而不是???

感谢

+0

你是什么意思 “*它不工作*”?你有任何错误? – 2012-03-09 09:10:32

+0

它甚至不编译。我不能使用任何类型,因为在映射期间我不知道TEntityType – Ivan 2012-03-09 09:12:48

回答

2

在NHibernate的你can't map a class with an open generic,如EntityBase<TEntityType>。不幸的是,你必须定义一个映射类为每个实体:

public class MyEntityMap : ClassMap<EntityBase<MyEntity>> 
{ 
    ... 
} 
4

你仍然可以通过创建一个通用的映射,然后使用,而不是创建静态类型的运行时类型,简化通过反射的过程:

private static void AddWeakReferenceMappings(FluentMappingsContainer container, Assembly assembly) 
    { 
     var genericMappingType = typeof (WeakReferenceMap<>); 
     var entityTypes = assembly.GetTypes().Where(type => type.IsSubclassOf(typeof (Entity))); 
     foreach (var enitityType in entityTypes) 
     { 
      var newType = genericMappingType.MakeGenericType(enitityType); 
      container.Add(newType); 
     } 
    } 
+0

使用片段将是有用的 – bashis 2017-01-09 14:22:40

1

作为一种变通方法,你可以定义将被EntityBaseMap实现的非一般的“代理”类:

public abstract class EntityProxy:IEntityBase 
{ 
    public virtual Int Id {get; set;} 
    /* Shared properties/ repetitive mappings */ 
} 

与制图

public class EntityProxyMap : ClassMap<EntityProxy> 
{ 
    /* Mapping*/ 
} 

所以,您都能够创造出EntityBase通过

public abstract class EntityBase<TEntityType> : EntityProxy where TEntityType : EntityBase<TEntityType> 
{ 
    /* Your implementation */ 
} 

最后使用

public class YourSubclassMap : SubclassMap<EntityBase<YourSubclass>> 
{ 
    /* Do any necessary sub-class mapping */ 
}