-1

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

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

我发现了 Ayende 的这篇文章union-subclass,这让我相信我可以用它来实现这一点(参见他的最后一种方法)。然而,他为他的抽象类包含了一个表名,这不在他的表模式中。

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

该表是否必须存在,或者 NHibernate 是否会忽略此属性?然后我可以省略它吗?

4

2 回答 2

0

这不是必需的。根据文档(感谢 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)来保存超类的实例。

于 2012-05-29T07:49:59.930 回答
-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);
   }
}
于 2012-05-24T14:53:40.403 回答