2009-08-27 61 views
2

我有不同种类的产品。现在,AppProduct有不同种类的数量 - 多重的价值,值列表等..流利NHibernate:子类内的子类

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表的一部分......这是歧视性的。

我尝试了不同的子类,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:元素命名空间“类的“瓮:NHibernate的映射 - 2.2”无效名字空间'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

如果您包含试图将此模型映射到的数据库模式,可能会有所帮助。如果没有它,我很难理解你的意图。 – 2009-08-29 00:06:47

+0

我没有任何模式,它是基于实体和FNH生成的映射生成的。所以它可以是任何你喜欢的。此外,手动HasMany异常的问题是最近FNH修订版中修复的错误(插入到所有子类中)。 – queen3 2009-08-31 07:58:22

回答

1

我不知道你在做什么。看起来你的对象模型可能存在一些问题。例如,它看起来像你有一个数量类(而不是一个标准的属性派生,也许,int)。你可能想重新考虑这一点。

如果你发现你遇到了AutoMapper的问题,你可以退后一步并使用标准(手动)映射和约定。

我认为问题最可能与您的对象模型,而不是一个流利的NHibernate问题。

你可以在http://wiki.fluentnhibernate.org/Fluent_mapping上找到Subclass映射的官方流利页面。

+0

它不是一个数量,它是“允许数量”,可以是* n或1,2,3,... n因此是不同的战略类别(也许我会在后面添加第三个策略)。这些不同的类有助于GetNextAllowedQuanity()方法。我可以有1个组件类,它会工作...但在switch(quantityStrategy)风格,这不是很好,也不是面向对象。 – queen3 2009-08-31 08:49:59

+0

好的。我还是不太明白。当你说“允许数量”时,你的意思是某种数量类型?它是否就像一个度量单位(例如,每个盎司,个案等)?您似乎可能会说的是,对于特定类型的产品,您希望能够将特定数量的允许类型列表关联起来。 – 2009-08-31 14:57:18

+0

嗯,实际上,我的数量类型在代码示例中表示为类...对于每个产品,我需要单个数量类型,因为它可以是乘数或值列表。因此,product1将具有字段Multiplier = 5,并且表AllowedProductQuantities(ProductId,Value)和product2中的值在AllowedProductQuantities表中将具有Multiplier = null和少量值。现在,我想看看如何使Quantity成为产品的一个组件,以便使用Product(Multiplier)字段,而不使用ProductMultiplers表(ProductId,Multiplier)。 – queen3 2009-09-04 12:32:13

相关问题