【问题标题】:Fluent NHibernate: subclasses inside subclassesFluent NHibernate:子类中的子类
【发布时间】: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


【解决方案1】:

我不确定您要完成什么。看起来您的对象模型可能存在一些问题。例如,看起来您有一个数量类(与可能源自 int 的标准属性相反)。您可能需要重新考虑这一点。

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

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

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

【讨论】:

  • 这不是一个数量,它是“允许数量”,可以是 *n 或 1,2,3,...n 因此不同的策略类(也许我稍后会添加第三个策略)。这些不同的类有助于使用类似 GetNextAllowedQuanity() 的方法。我可以有 1 个类似组件的类,它会工作......但在 switch(quantityStrategy) 样式中,它不是很好也不是面向对象的。
  • 好的。我还是不太明白。当您说“允许数量”时,您是指某种数量类型吗?它是否像一个计量单位(例如,每个、盎司、箱等)?看起来您可能要说的是,对于特定类型的产品,您希望能够关联特定数量的允许类型列表。
  • 嗯,实际上我的数量类型在代码示例中表示为类...对于每个产品,我需要单个数量类型,因为这可以是乘数或值列表。因此,product1 的字段 Multiplier = 5 并且表 AllowedProductQuantities (ProductId, Value) 中没有值,并且 product2 的 Multiplier = null 并且表 AllowedProductQuantities 中的值很少。现在,我想看看如何使 Quantity 成为 Product 的 COMPONENT,这样我就有了 Product (Multiplier) 字段,而不是 ProductMultiplers 表和 (ProductId, Multiplier)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2011-10-03
  • 2013-05-20
  • 1970-01-01
  • 2012-03-07
相关资源
最近更新 更多