2012-03-09 44 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 */ 
}