Часть модели, которую я разрабатываю, представляет собой иерархию географических местоположений. Поскольку существует несколько слоев и имеется некоторая информация, я решил использовать такую иерархию классов:
public class GeographicNode
{
public virtual int Id { get; private set; }
public virtual string Name { get; set; }
public virtual GeographicNode ParentNode { get; set; }
public virtual IList<GeographicNode> ChildNodes { get; set; }
}
public class Region : GeographicNode
{
public virtual int SomeRegionData { get; set; }
}
public class Country : GeographicNode
{
public virtual int SomeCountryData { get; set; }
}
Чтобы отобразить это, я использую метод иерархии «таблица на класс». Отображение Fluent nHibernate выглядит так:
public class GeographicNodeMap : ClassMap<GeographicNode>
{
public GeographicNodeMap()
{
Id(x => x.Id);
Map(x => x.Name);
References(x => x.ParentNode);
HasMany(x => x.ChildNodes).KeyColumn("Id").Cascade.All();
DiscriminateSubClassesOnColumn("Type");
}
}
public class RegionMap : SubclassMap<Region>
{
public RegionMap()
{
Map(x => x.SomeRegionData)
}
}
public class CountryMap : SubclassMap<Region>
{
public CountryMap()
{
Map(x => x.SomeCountryData)
}
}
Вот мой вопрос:
Когда я получаю узел и пытаюсь получить доступ к ParentNode (или дочерним узлам), его тип на самом деле является GeographicNode, а не соответствующим подклассом. Так, например, если я получаю узел региона, а его родительский узел должен быть узлом страны, я не могу преобразовать ParentNode в класс страны.
Есть ли способ заставить nHibernate создавать экземпляры объектов ParentNode и Child с их соответствующим подклассом? Эта информация хранится в столбце Тип, поэтому для nHibernate было бы разумно создать экземпляр правильного подкласса.
Также есть ли здесь какие-либо серьезные проблемы с использованием наследования? Использование иерархии классов сокращает объем кода (по крайней мере, в модели), но меня беспокоит, что наличие этих неявных, а не явных отношений (например, родителем региона всегда является страна) может вызвать у меня проблемы позже. .
Спасибо!