Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

EntityCollection Clear() and Remove() methods

What is the right way to delete all of the collection items of an EF entity? In the code below, DocumentItems is the collection of related document items for a document. This code proceedes on Clear() but fails on SaveChanges() because related items are connected to their document via FK and FK is mandatory. So I guess they somehow remain floating up in the air without a foreign key after Clear().

Do I solve this with a foreach loop over the collection calling Remove() on each item or is there another way?

// remove existing document items to prepare for refreshing them
existing.DocumentItems.Clear();
// adds new Document Items
PrepareInvoice(existing, collection);
_repository.SaveChanges();
like image 647
mare Avatar asked Oct 06 '10 17:10

mare


2 Answers

This is one way of deleting the items in the collection.

VB

TEntityCollection.ToList().ForEach(Sub(o) ctx.DeleteObject(o))

C#

TEntityCollection.ToList().ForEach(x => ctx.DeleteObject(x))

Then you need to call

ctx.SaveChanges()
like image 125
Brian Rizo Avatar answered Oct 06 '22 01:10

Brian Rizo


Clear just removes the reference but doesn't delete the entity.

In your situation

existing.DocumentItems.Clear();  

All DocumentItems in the EntitySet will get cleared but you will have to Remove/Delete the actual DocumentItem or the commit with fail, just the same as it would if you tried to delete it in the database.

You need to loop through detach any references, and then delete the entity you wish to remove (unless its nullable and in your situation, it is not)


Alternatively, I have seen implementations that use clear, and an AssociationChangedHandler to automatically delete the old object. Basically, if the change is a "delete/remove" it calls DeleteObject() on the orphaned object.

like image 40
Nix Avatar answered Oct 06 '22 00:10

Nix