在将union-subclass与NHibernate一起使用时,是否必须为抽象和无表基类指定表?

时间:2012-05-24 14:39:09

标签: nhibernate inheritance nhibernate-mapping

我们有一个BaseEntity,我们所有其他域类都继承了它。在这个BaseEntity上有一些基本属性。例如,这可能类似于DateLastChange

我们将NHibernate与hbm映射文件一起使用。我试图避免在每个映射文件中映射DateLastChange

我找到了Ayende的this post,这让我相信我可以用union-subclass来实现这个目标(参见他的最后一个方法)。但是,他为自己的抽象类包含了一个表名,而不是在他的表模式中。

<class name="Party"
    abstract="true"
    table="Parties">
...

表必须存在,还是NHibernate会忽略这个属性?我可以省略它吗?

2 个答案:

答案 0 :(得分:0)

这不是必需的。根据{{​​3}}(感谢kalki):

<class name="Payment">
    <id name="id" type="long" column="PAYMENT_ID">
        <generator class="sequence"/>
    </id>
    <property name="amount" column="AMOUNT"/>
    ...
    <union-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">
        <property name="creditCardType" column="CCTYPE"/>
        ...
    </union-subclass>
    <union-subclass name="CashPayment" table="CASH_PAYMENT">
        ...
    </union-subclass>
    <union-subclass name="ChequePayment" table="CHEQUE_PAYMENT">
        ...
    </union-subclass>
</class>

  

如果您的超类是抽象的,请使用abstract =“true”进行映射。如果是   不抽象,一个额外的表(它默认为PAYMENT中的   上面的例子,需要保存超类的实例。

答案 1 :(得分:-1)

我在fluentnhibernate中有以下抽象类:

    public abstract class EntityMapping<TEntity> : ClassMap<TEntity> where TEntity : EntityBase
        {
            protected EntityMapping()
            {
                Id(x => x.Id, "Id")
                    .UnsavedValue("00000000-0000-0000-0000-000000000000")
                    .GeneratedBy.GuidComb()
                    .Index("IX_Lookup");
                OptimisticLock.Version();
                Version(x => x.Version);
Map(x=>x.DateLastChange); // your column
            }
        }

所有其他映射都使用抽象类:

public SomeEntityMap:EntityMapping<SomeEntity>{
   public SomeEntityMap(){
      Map(x=>x.SomeProperty);
   }
}