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生成器映射的类型,泛型的类型检查有气味,我想知道是否有更好的方法来处理它。
- 我的域实体ID的泛型类型在整个过程中都被使用,在其他任何地方都很有效(而且它被广泛使用)
- 如果可以避免的话,我宁愿不必在每个实体的ClassMap中定义ID映射。如果这是唯一的方法,我会接受它
想法和建议?
我无法编译您的代码,但我很惊讶它能正常工作。
难道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();
}
}
看起来没有什么比我现在拥有的更好的了。