【发布时间】:2010-11-23 07:45:31
【问题描述】:
我有不同种类的产品。现在,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[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:命名空间“urn:nhibernate-mapping-2.2”中的元素“类”在命名空间“urn:nhibernate-mapping-2.2”中具有无效的子元素“bag”。预期的可能元素列表:命名空间“urn:nhibernate-mapping-2.2”中的“元、子选择、缓存、同步、注释、tuplizer、id、复合id”。
虽然导出的 Orders.Core.Quantity.hbm.xml 的唯一区别是一对多的类类型......即 NHibernate 不会抱怨几乎相同映射中的包。
(注意:这可能是最近 FNH 中修复的错误,第 299 期)。
无论如何,加入子类在这里并不是完美的解决方案。我什至考虑只在 AppProduct 中做组件,并在分配属性“QuantityType”时自己创建适当的数量对象……不过,这太奇怪了。或者也许切换到 Linq2Sql 会有所帮助? ;-)
【问题讨论】:
-
如果您包含您试图将此模型映射到的数据库模式,这可能会有所帮助。没有它,我很难理解你的意图。
-
我没有任何架构,它是根据实体和 FNH 生成的映射生成的。所以它可以是你喜欢的任何东西。此外,手动 HasMany 异常的问题是最近 FNH 修订版中修复的错误(将覆盖插入所有子类)。
标签: nhibernate fluent-nhibernate