使用FluentNHibernate映射通用EntityBase <tentity>类</tentity>

时间:2012-03-09 09:06:15

标签: nhibernate fluent-nhibernate

我的所有实体类型都有基类,如

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<???>>

我应该插入什么而不是???

由于

3 个答案:

答案 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 */
}