流畅的NHibernate:子类中的子类

时间:2009-08-27 09:46:34

标签: nhibernate fluent-nhibernate

我有不同种类的产品。现在,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会有帮助吗? ; - )

1 个答案:

答案 0 :(得分:1)

我不确定你想要完成什么。看起来您的对象模型可能存在一些问题。例如,看起来你有一个数量类(而不是从int派生的标准属性)。你可能想重新考虑一下。

如果您发现AutoMapper遇到问题,可以退回并使用标准(手动)映射以及约定。

我认为问题最有可能出现在您的对象模型而不是Fluent-NHibernate问题上。

您可以在http://wiki.fluentnhibernate.org/Fluent_mapping找到关于子类映射的官方流利页面。