NHibernate与抽象类的参照完整性

时间:2012-06-07 20:41:34

标签: c# nhibernate

我有这种情况,一个产品基类是抽象的和两个具体的子类(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自动检查完整性?

1 个答案:

答案 0 :(得分:1)

实现IPreDeleteEventListener和伪代码

Product p = entity as Product;
if (p != null && p.InvoiceItems.Count > 0)
    throw new MyException();