我有这种情况,一个产品基类是抽象的和两个具体的子类(Car,Bike)。然后是一个Invoice,它拥有一个InvoiceItem集合。 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>
InvoiceItem类
<?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自动检查完整性?
答案 0 :(得分:1)
实现IPreDeleteEventListener
和伪代码
Product p = entity as Product;
if (p != null && p.InvoiceItems.Count > 0)
throw new MyException();