NHibernate列的唯一性和继承性

时间:2010-12-23 20:02:09

标签: c# nhibernate inheritance mapping

考虑下面的映射文件。这两个类都有不同的businessId概念,对象模型处理它,但是可以将它作为普通字符串存储在一列中。我也希望它们各自与Allocations集具有相同的关系,这是我希望它们使用继承映射的主要原因。

虽然项目的业务ID与账户相同的可能性今天很小,但如果有办法使businessId和discriminator的组合成为自然id的一部分,那将是理想的。这是不允许的,也许是因为我没有看到的一些好理由。

我能以一种明显的方式改进这种映射吗?

干杯,
Berryl

<class name="ActivitySubject" table="ActivitySubjects" discriminator-value="BASE_CLASS">

<id name="Id" unsaved-value="0">
  <column name="ActivitySubjectId" />
  <generator class="hilo" />
</id>

<discriminator column="ActivitySubjectType" type="System.String" />

<natural-id mutable="true">
  <property name="BusinessId" length="25" not-null="true" />
</natural-id>

<property name="Description" length="75" not-null="true" />

<set access="field.camelcase-underscore" cascade="all-delete-orphan" inverse="true" name="Allocations">
  <key foreign-key="Allocations_Resource_FK">
    <column name="ActivityId" />
  </key>
  <one-to-many class="Allocation />
</set>

<subclass name="Account" discriminator-value="ACCOUNT" />

<subclass name="SProject" discriminator-value="PROJECT" />

这是我最终让两个列成为同一个唯一索引的一部分的方式:

<discriminator type="System.String"  >
  <column name="ActivitySubjectType" unique-key="ActivitySubjectTypeBusinessId" />
</discriminator>

<property name="BusinessId" length="25" not-null="true" node="1" unique-key="ActivitySubjectTypeBusinessId"/>

1 个答案:

答案 0 :(得分:3)

不要将自然ID用于主键。我将使用合成密钥,数据库生成的标识或主键的GUID,并在BusinessId和ActivitySubjectType的组合上添加唯一约束。