NHibernate:多个表的同一类

NHibernate:多个表的同一类,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我有一个文件附件类(FileAttachment),它在其他几个类中使用 e、 g.一篇文章包含多个附件。类别包含多个附件。这些附件实际上是同一个FileAttachment类,但由于明显的原因,它们被持久化在不同的表中。e、 g.article\u FileAttachments表中文章的文件附件和category\u FileAttachments表中的类别文件附件 如何在nhibernate映射中表示这种关系?thx这里有一些选项-我不知道哪一个最适合您: 您可以使用和。我自己没有用过这个

我有一个文件附件类(FileAttachment),它在其他几个类中使用


e、 g.一篇文章包含多个附件。类别包含多个附件。这些附件实际上是同一个FileAttachment类,但由于明显的原因,它们被持久化在不同的表中。e、 g.article\u FileAttachments表中文章的文件附件和category\u FileAttachments表中的类别文件附件


如何在nhibernate映射中表示这种关系?thx

这里有一些选项-我不知道哪一个最适合您:

  • 您可以使用
    和。我自己没有用过这个,所以我不完全确定它是否有用
  • 创建从FileAttachment派生的ArticleAttachment和CategoryAttachment类。这些类可以正常映射,NHib不需要特别告知基类。这里的问题是,您将无法映射同时包含ArticleAttachments和CategoryAttachments的集合
  • 有一个单独的文件附件表,用于存储所有附件的详细信息。然后,可以使用
    连接将它们链接到您的文章和类别表

  • 有关NHibernate的多态映射规则,请参见第8章

    简言之,您将需要一个鉴别器列来指定哪个鉴别器持续存在于哪个表中。这是NHibernate文档中的一个实例,或者如果使用继承,则只需将派生类映射为子类,并从基类型类映射中为每个派生类指定datatable名称

    <class name="IPayment" table="PAYMENT">
      <id name="Id" type="Int64" column="PAYMENT_ID">
        <generator class="native"/>
      </id>
      <property name="Amount" column="AMOUNT"/>
      ...
      <joined-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">
        <key column="PAYMENT_ID"/>
        ...
      </joined-subclass>
      <joined-subclass name="CashPayment" table="CASH_PAYMENT">
        <key column="PAYMENT_ID"/>
        ...
      </joined-subclass>
      <joined-subclass name="ChequePayment" table="CHEQUE_PAYMENT">
        <key column="PAYMENT_ID"/>
        ...
      </joined-subclass>
    </class>
    
    
    ...
    ...
    ...
    ...
    
    您可能会注意到,付款是一种付款,无论其类型如何。因此,它被映射为IPayment。然后,在多个表中进行子分类,这些表通过其鉴别器列表示每种支付类型


    “这些附件实际上是同一个FileAttachment类,但很明显,它们被保存在不同的表中。”嗯?你的架构不好!您应该有一个“附件”之类的表,其他表都可以通过外键指向该表。由于需要多对多关系,您仍然会有多个表。请您详细解释一下第三个选项好吗?thxTable ArticleAttachment:columns ArticleID、FileAttachmentID表CategoryAttachment:columns CategoryID、FileAttachmentID表FileAttachment:columns ID、Name等您的文章和类别映射应包括以下内容: