FluentHibernate基础ClassMap<;T>;以及避免使用typeof(T)来确定用于定义NHib

本文关键字:typeof 用于 NHib 定义 lt ClassMap 基础 gt FluentHibernate | 更新日期: 2023-09-27 17:58:01

为了集中每个FluentHibernate类映射的一些逻辑(特别是映射审核属性和实际主ID),我有一个名为AuditedEntityClassMap的基本ClassMap,它如下所示:

public class AuditedEntityClassMap<TEntity, T> : ClassMap<TEntity> where TEntity : AuditedPersistentObject<T>
{
    public AuditedEntityClassMap()
    {
        Cache.ReadWrite();
        DynamicUpdate();
        ApplyId();
        this.ChangeAuditInfo();
    }
    protected virtual void ApplyId()
    {
            if (typeof(T) == typeof(int))
                map.Id(x => x.Id).GeneratedBy.HiLo(HiLoConstants.NHibernateHiLoTable, HiLoConstants.NHibernateHiLoColumn, HiLoConstants.NHibernateHiLoMaxLo);
            else if (typeof(T) == typeof(Guid))
                map.Id(x => x.Id).GeneratedBy.GuidComb();
            else
                throw new InvalidIdTypeInClassMappingException("Invalid type set in class mapping: " + typeof(T));
    }
}

我的问题是,为了确定应该用于它的NHibernate生成器映射的类型,泛型的类型检查有气味,我想知道是否有更好的方法来处理它。

  1. 我的域实体ID的泛型类型在整个过程中都被使用,在其他任何地方都很有效(而且它被广泛使用)
  2. 如果可以避免的话,我宁愿不必在每个实体的ClassMap中定义ID映射。如果这是唯一的方法,我会接受它

想法和建议?

FluentHibernate基础ClassMap<;T>;以及避免使用typeof(T)来确定用于定义NHib

我无法编译您的代码,但我很惊讶它能正常工作。

难道t不是DataClass而不是id吗?

我可以做的另一种方式是反思,但我无法想象这会是更好的方式。

您可以通过反射获得T的属性,并搜索名为Id或Id的属性。然后获取该属性的类型。但我不知道在这种情况下你会怎么称呼Map。

var pp = typeof(T).GetProperties().Where(p => p.Name == "Id").FirstOrDefault();
if (pp != null)
{
  if (pp.PropertyType.Name == "Int64" || pp.PropertyType.Name == "Int32")
  {
    Map();
  }
}

看起来没有什么比我现在拥有的更好的了。