TheBoubou
TheBoubou

Reputation: 19903

NHibernate : Delete a record in many-to-many relationshio

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" />

Upvotes: 1

Views: 189

Answers (2)

Dmitry
Dmitry

Reputation: 17350

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.

Upvotes: 3

Baz1nga
Baz1nga

Reputation: 15579

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);

Upvotes: 0

Related Questions