-1

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

4

1 回答 1

1

实现一个IPreDeleteEventListener和伪代码

Product p = entity as Product;
if (p != null && p.InvoiceItems.Count > 0)
    throw new MyException();
于 2012-06-08T07:12:36.730 回答