I'm trying to understand why Entity Framework works the way it does with deleting child entities!
I have a YogaSpace
object/entity and a child entity called YogaSpaceImage
. I want to delete a YogaSpaceImage
from YogaSpace
, so here is what I do.
This DOES NOT work
yogaSpace.Images.Remove(yogaSpaceImage);
to delete a child entity!
public string RemoveImage(int id, int imageIdToDelete)
{
YogaSpace yogaSpace = _yogaSpaceRepository.Find(id);
// delete image
foreach (YogaSpaceImage yogaSpaceImage in yogaSpace.Images.OrderBy(m => m.Ordering))
{
if (yogaSpaceImage.YogaSpaceImageId == imageIdToDelete)
{
// check first to see if the deleted image is the first (primary) image, then make the 2nd image the yogaspace thumbnail
if (yogaSpaceImage.Ordering == 1)
{
yogaSpace.SpaceThumbnail = yogaSpace.Images.First(m => m.Ordering == 2).ImageThumbnail;
}
yogaSpace.Images.Remove(yogaSpaceImage);
}
}
}
myRepository.InsertOrUpdate(YogaSpace);
myRepository.Save()
}
This does work when I call myRepo.Removed(YogaSpaceImage)
.
public string RemoveImage(int id, int imageIdToDelete)
{
YogaSpace yogaSpace = _yogaSpaceRepository.Find(id);
// delete image
foreach (YogaSpaceImage yogaSpaceImage in yogaSpace.Images.OrderBy(m => m.Ordering))
{
if (yogaSpaceImage.YogaSpaceImageId == imageIdToDelete)
{
// check first to see if the deleted image is the first (primary) image, then make the 2nd image the yogaspace thumbnail
if (yogaSpaceImage.Ordering == 1)
{
yogaSpace.SpaceThumbnail = yogaSpace.Images.First(m => m.Ordering == 2).ImageThumbnail;
}
_yogaSpaceRepository.Removed(yogaSpaceImage);
}
}
}
myRepository.Save()
}
Here is what Removed()
and InsertOrUpdate()
look like in my repo.
public void InsertOrUpdate(YogaSpace yogaSpace)
{
if (yogaSpace.YogaSpaceId == default(int))
{
context.Entry(yogaSpace).State = System.Data.Entity.EntityState.Added;
}
else
{
context.Entry(yogaSpace).State = System.Data.Entity.EntityState.Modified;
}
}
public void Removed(YogaSpaceImage yogaSpaceImage)
{
context.Entry(yogaSpaceImage).State = EntityState.Deleted;
}
P.S. you would think InsetOrUpdate()
in my repo would work for EntityState.Modified
to remove a child entity?
P.P.S. not sure why I even need InsertOrUpdate()
, it was built with the auto generated nuget package. If I don't use it and just call Save()
, Entity Framework understands the changes I've made, so why the heck is it generated for me and why does entity.Added
and entity.Modified
even exist, because entities get saved and modified even if I don't explicitly calls these two?