I have a开发者_开发问答 object Customer
, this object has an ISet
list of Contact
. When I delete a Customer
I'd like to delete the Contact
.
I use the mapping below, I tried all option in cascade but still have this problem : The DELETE statement conflicted with the REFERENCE constraint "FK4FF8F4B29499D0A4". The conflict occurred in database "MyDB", table "dbo.Contact", column 'Customer'.
The mapping Customer
<set name="Contacts" table="CustomerContact" cascade="save-update">
<key column="Customer" />
<many-to-many class="Contact" column="Contact" />
</set>
The mapping Contact
<many-to-one name="Customer" column="Customer" not-null="true" />
It is strange that you have bidirectional association between customer and contact mapped like that. If Customer can be associated with multiple Contacts, and vice versa, you should have many-to-many on both sides. But you have many-to-one at Contact side. And you mention that you want to cascade deletes to Contact.
Perhaps you should consider mapping Contacts collections as one-to-many? Try this for Customer mapping, note inverse attribute.
<set name="Contacts"
table="CustomerContact"
inverse="true"
cascade="all-delete-orphan" >
<key column="Customer" />
<one-to-many class="Contact" />
</set>
With this Contact mapping:
<many-to-one name="Customer" column="Customer" />
You will also have to 'chase the pointers': null out Customer.Contact when corresponding Contact is removed from Customer.Contacts collection.
having the two propeties
inverse="true"
and
cascade="all-delete-orphan"
is the key..
apart from this you can as well do this while deleting the customer object:
customer.Contacts.Clear();
Session.Delete(customer);
精彩评论