Details
-
Improvement
-
Status: Open
-
Major
-
Resolution: Unresolved
-
None
-
None
-
None
Description
It should be good to change default delete rule of runtime relationship from NO_ACTION to NULLIFY. It will protect us from bogus references in dependent objects without reverse relationships.
Suppose we have such model:
- ARTIST(ID, NAME) ==> Artist(name, paintings)
- PAINTING(ID, NAME, ARTIST_ID, GALLERY_ID) ==> Painting(name, artist) // no reverse to Gallery
- GALLERY(ID, NAME) ==> Gallery(name, paintings)
Delete rule of relationship Artist-toMany-Paintings is set to CASCADE. Expect that after deleting Artist corresponding Paintings will be deleted too.. and also deleted from galleries thanks to reverse runtime relationship Painting-toOne-Gallery created by Cayenne.
After adding data to database (print result of SelectQuery):
- Artists: Picasso
- Paintings: "Girl Reading at a Table" by Picasso
- Galleries: Metropolitan Museum of Art: ["Girl Reading at a Table" by Picasso]
After deleting object Picasso (print result of SelectQuery):
- Artists:
- Paintings:
- Galleries: Metropolitan Museum of Art: ["Girl Reading at a Table" by null] // that is BIZARRE!
This happens because when cascade delete comes to painting Girl it detects relationship with delete rule NO_ACTION. And so gallery stays with bogus reference.
PS. After recreation of ObjectContext all bogus objects of course dissapear because they do not exist in database.