开发者

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

开发者 https://www.devze.com 2023-03-31 17:17 出处:网络
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 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);
0

精彩评论

暂无评论...
验证码 换一张
取 消