-1

私はこのような状況にあり、抽象的で 2 つの具体的なサブクラス (車、自転車) である製品基本クラスがあります。次に、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>

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 に整合性を自動的にチェックさせる方法はありますか?

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 に答える