我们有一个BaseEntity,我们所有其他域类都继承了它。在这个BaseEntity上有一些基本属性。例如,这可能类似于DateLastChange
。
我们将NHibernate与hbm
映射文件一起使用。我试图避免在每个映射文件中映射DateLastChange
。
我找到了Ayende的this post,这让我相信我可以用union-subclass
来实现这个目标(参见他的最后一个方法)。但是,他为自己的抽象类包含了一个表名,而不是在他的表模式中。
<class name="Party"
abstract="true"
table="Parties">
...
表必须存在,还是NHibernate会忽略这个属性?我可以省略它吗?
答案 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);
}
}