How to get CascadeDeleted entities in change tracker

394 Views Asked by At

Since EF Core 3 the delete-behaviour changed. I want to implement soft delete, and I thought this might be helpful...

I have lazy loading enabled and a generic delete method:

this.context.Set<TEntity>().Remove(entity);

Before SaveChanges I add meta information.

First I try to find all ChangeTracker entries like this:

var entityEntries = dbContext.ChangeTracker.Entries()
            .Where(x => x.Entity is IMyMetaDataBase
                        && (x.State == EntityState.Added 
                               || x.State == EntityState.Modified 
                               || x.State == EntityState.Deleted));

But I only find the principal entity in above collection to perform soft delete like this:

if (entityEntry.Entity is IMyDeletableInterface deletable && entityEntry.State == EntityState.Deleted)
{
    EntityEntry.State = EntityState.Modified;
    deletable.Deleted = true;
}

If I set the EntityState modified (which is the thing to do I suppose) the principal entity is set deleted, but all dependent entities remain unchanged. If I don´t change the EntityState, all dependent entities will be removed. My main question: Is there a way to find the entities, EF will remove in cascade operation..?

netcoreapp3.1, ef core 3.1.8

1

There are 1 best solutions below

1
On

Something like this would help.

public override int SaveChanges()
{
    // Soft-Delete 
    var entities = ChangeTracker.Entries()
        .Where(e => e.State == EntityState.Deleted && e.Metadata.GetProperties()
        .Any(x => x.Name == "IsDeleted"))
        .ToList();

    foreach (var entity in entities)
    {
        entity.State = EntityState.Unchanged;
        entity.CurrentValues["IsDeleted"] = true;
    }

    return base.SaveChanges();
}