Сопоставить универсальный класс EntityBase <TEntity>с FluentNHibernate - PullRequest
3 голосов
/ 09 марта 2012

У меня есть базовый класс для всех моих типов сущностей, например,

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 ]

4 голосов
/ 10 октября 2012

Тем не менее, вы можете упростить процесс с помощью отражения, создав общее отображение и затем используя типизацию во время выполнения вместо создания статических типов:

    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);
        }
    }
2 голосов
/ 09 марта 2012

В NHibernate вы не можете сопоставить класс с открытым универсальным , таким как EntityBase<TEntityType>.К сожалению, вам придется определить класс отображения для каждой из сущностей:

public class MyEntityMap : ClassMap<EntityBase<MyEntity>>
{
    ...
}
1 голос
/ 27 марта 2013

В качестве обходного пути вы можете определить неуниверсальный класс «Proxy», который будет реализован с помощью 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 */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...