我的所有实体类型都有基类,如
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 :(得分: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);
}
}
答案 1 :(得分:2)
在NHibernate中can't map a class with an open generic,例如EntityBase<TEntityType>
。不幸的是,你必须为每个实体定义一个映射类:
public class MyEntityMap : ClassMap<EntityBase<MyEntity>>
{
...
}
答案 2 :(得分: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 */
}