我有这种情况,一个抽象的产品基类和两个具体的子类(汽车、自行车)。然后是拥有 InvoiceItem 集合的 Invoice。InvoiceItem 引用一个 Product 实例。这是hbms:
产品类别
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="MyAssembly"
namespace="MyNamespace">
<class name="Product" abstract="true">
<id name="Id" column="id">
<generator class="guid.comb" />
</id>
<property name="Code" column="code" type="string" not-null="true" />
<property name="Name" column="name" type="string" not-null="true" />
<set name="Items" inverse="true">
<key column="productId" />
<one-to-many class="InvoiceItem"/>
</set>
<union-subclass name="Car" table="Cars">
<property name="EngineName" column="engineName" not-null="true" />
</union-subclass>
<union-subclass name="Bike" table="Bikes">
<property name="ShifterSpeedCount" column="shifterSpeedCount" type="int" not-null="true" />
</union-subclass>
</class>
</hibernate-mapping>
发票项目类
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="MyAssembly"
namespace="MyNamespace">
<class name="InvoiceItem" table="InvoiceItems">
<id name="Id" column="id">
<generator class="guid.comb" />
</id>
<property name="Price" column="price" precision="15" scale="3" not-null="true" />
<property name="Count" column="count" type="int" not-null="true" />
<many-to-one name="Product" column="productId" foreign-key="FK_ProductInvoiceItems" />
</class>
</hibernate-mapping>
我遇到的问题是,当我删除 Car 的实例时,NHibernate 不会检查 InvoiceItem 中的完整性,因此在删除之后,我的引用损坏了,从而导致了问题。
问题是由于继承引起的,productId列不能引用单个表,导致NHibernate不生成FK。
这个场景非常简单,所以可能手动检查参考很简单。但是如何在更复杂的项目中解决这个问题呢?有没有办法强制 NHibernate 自动检查完整性?