У меня есть разные виды товаров. Теперь в AppProduct есть разные виды величин - умножение значений, список значений и т. Д.
public class Product : Entity
{
}
public class Quantity: Entity
{
}
public class ListQuantity : Quantity
{
public virtual IList<int> Quantities { get; set; }
}
public class MultiplierQuantity : Quantity
{
public virtual int Multiplier { get; set; }
}
public class AppProduct : Product
{
public virtual Quantity Quantity { get; set; }
}
Возникает вопрос: возможно ли вообще отображение с FNH или NH? В частности, с автоматическим отображением. Для меня было бы естественным отображать продукты в их собственных таблицах, но количество было бы частью таблицы AppProducts ... то есть с разграничением.
Я безуспешно пробовал разные Subclass, JoinedSubclass и т. Д., Каждый с разными исключениями NH. Это работает только тогда, когда обе иерархии по умолчанию сопоставлены с объединенным подклассом. Однако автоматическое сопоставление не может автоматически отображать IList [int]. Если я установлю IList [Product] (для тестирования), все будет работать отлично. Если я попытаюсь сохранить IList [int], используя это сопоставление:
public class ListQuantityMap : IAutoMappingOverride<ListQuantity>
{
public void Override(AutoMap<ListQuantity> mapping)
{
mapping.HasMany(x => x.Quantities).AsElement("QuantitiesId");
}
}
в случае сбоя с System.Xml.Schema.XmlSchemaValidationException: элемент 'class' в пространстве имен 'urn: nhibernate-mapping-2.2' имеет недопустимый дочерний элемент 'bag' в пространстве имен 'urn: nhibernate-mapping-2.2'. Список возможных ожидаемых элементов: «мета, подзапрос, кеш, синхронизация, комментарий, туплайзер, идентификатор, составной-идентификатор» в пространстве имен «urn: nhibernate-mapping-2.2».
хотя единственная разница в экспортируемых Orders.Core.Quantity.hbm.xml - это тип класса один-ко-многим ... т.е. NHibernate не жалуется на мешок почти в том же отображении.
(примечание: вероятно, это ошибка, исправленная в недавнем FNH, issue # 299).
В любом случае, объединенный подкласс - не идеальное решение. Я даже думаю о том, чтобы сделать просто компонент в AppProduct и сам создать соответствующий количественный объект, когда назначено свойство QuantityType ... хотя это слишком странно. А может, переход на Linq2Sql поможет? ;-)