I'm using EF Code First but my models have NO relationships (PKs - FKs). So I'm trying to find a way to workaround it by using EF6 Reflections in order to avoid an entry deletion that would have relationships (same property name).
- Lookup over all my context entities in which has any specific property (FK);
- For every entity found, check if this entity has any entry;
- If its true, instead of deleting my entry, set a property "Canceled" as true;
If its false, keep entity state deleted and save my context changes;
public override int SaveChanges() { foreach (var myEntity in ChangeTracker.Entries<IAuditable>()) { if (myEntity.State == EntityState.Deleted) { ObjectContext objContext = ((IObjectContextAdapter)this).ObjectContext; var container = objContext.MetadataWorkspace.GetEntityContainer(objContext.DefaultContainerName, DataSpace.CSpace); var objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(myEntity.Entity); var entityKeys = objectStateEntry.EntityKey.EntityKeyValues; var entity = myEntity; var hasAnyFk = false; foreach (var entityKey in entityKeys) { if (hasAnyFk) { break; } var keyName = entityKey.Key; foreach (var entitySet in container.EntitySets) { hasAnyFk = entitySet.ElementType.Members.Any(es => es.Name == keyName); if (hasAnyFk) { break; } } } if (hasAnyFk) { var deletedProperty = myEntity.OriginalValues.PropertyNames.Where(p => myEntity.Property(p).Name == "Deleted").FirstOrDefault(); if (deletedProperty != null) { myEntity.State = EntityState.Modified; myEntity.CurrentValues[deletedProperty] = true; } } } }
return base.SaveChanges(); }