我有不同种类的产品。现在,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异常。它仅在默认情况下使用连接的子类映射两个层次结构时才有效。但是,automapper无法自动映射IList [int]。如果我设置IList [产品](测试)一切都很完美。如果我尝试使用此映射保持IList [int]:
public class ListQuantityMap : IAutoMappingOverride<ListQuantity>
{
public void Override(AutoMap<ListQuantity> mapping)
{
mapping.HasMany(x => x.Quantities).AsElement("QuantitiesId");
}
}
如果失败了 System.Xml.Schema.XmlSchemaValidationException:命名空间'urn:nhibernate-mapping-2.2'中的元素'class'在命名空间'urn:nhibernate-mapping-2.2'中具有无效的子元素'bag'。期望的可能元素列表:命名空间'urn:nhibernate-mapping-2.2'中的'meta,subselect,cache,synchronize,comment,tuplizer,id,composite-id'。
虽然导出的Orders.Core.Quantity.hbm.xml的唯一区别是一对多类类型...即NHibernate不会抱怨几乎相同的映射包。
(注意:这可能是最近FNH修正的错误,问题#299)。
无论如何,加入子类并不是完美的解决方案。我甚至考虑在AppProduct中只做组件并在分配属性“QuantityType”时自己创建适当的数量对象......但是太奇怪了。或者转换到Linq2Sql会有帮助吗? ; - )
答案 0 :(得分:1)
我不确定你想要完成什么。看起来您的对象模型可能存在一些问题。例如,看起来你有一个数量类(而不是从int派生的标准属性)。你可能想重新考虑一下。
如果您发现AutoMapper遇到问题,可以退回并使用标准(手动)映射以及约定。
我认为问题最有可能出现在您的对象模型而不是Fluent-NHibernate问题上。
您可以在http://wiki.fluentnhibernate.org/Fluent_mapping找到关于子类映射的官方流利页面。