FluentNHibernate base ClassMap <T>и избегая использования typeof (T) для определения типа идентификатора объекта для определения генератора NHibernate - PullRequest
2 голосов
/ 31 мая 2011

Чтобы централизовать часть моей логики для каждого отображения классов FluentNHibernate (особенно для отображения свойств аудита и фактического первичного идентификатора), у меня есть базовый ClassMap с именем AuditedEntityClassMap, который выглядит примерно так:

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. Общий тип для идентификаторов сущностей моего домена используется повсеместно и отлично работает везде (и широко).
  2. Я бы предпочел не определять идентификаторотображение в ClassMap каждой сущности, если я могу избежать этого.Если это единственный способ сделать это, я буду жить с этим.

Мысли и предложения?

Ответы [ 2 ]

0 голосов
/ 09 августа 2011

Похоже, нет ничего лучше, чем у меня сейчас.

0 голосов
/ 01 июня 2011

Я не смог заставить ваш код скомпилироваться, но я удивлен, что он работает.

Не будет ли T классом данных вместо идентификатора.

Другой способ, которым я могу воспользоваться, - это отражение, но я не могу себе представить, что это намного лучший способ.

Вы можете получить свойства 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();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...