Estoy tratando de implementar una función de eliminación suave en mi proyecto anulando el método y deshaciendo la eliminación de las entidades que implementan mi interfaz ISoftDelete
.Supresión de eliminación de entidad con asociaciones
interface ISoftDelete
{
bool IsDeleted { get; set; }
}
En el método SaveChanges()
Estoy llamando método de mi SoftDelete() para cada entrada que se encuentra en estado 'borrado' e implementa ISoftDelete
:.
var entries = this.ChangeTracker.Entries().Where(x => (x.State == EntityState.Deleted) && x.Entity is ISoftDelete)
.ToList();
entries.ForEach(SoftDelete);
Mi método SoftDelete()
es el siguiente:
private void SoftDelete(DbEntityEntry entry)
{
if (entry.State == EntityState.Deleted && entry.Entity is ISoftDelete)
{
entry.Reload();
var entity = (ISoftDelete)entry.Entity;
entity.IsDeleted = true;
entry.State = EntityState.Modified;
}
}
Esto funcionará perfectamente hasta que me encuentre con una entidad que tiene una asociación uno a uno con otra cosa. En ese momento, se inicia una excepción con este error:
{"A relationship from the 'ChildParent' AssociationSet is in the 'Deleted' state. Given multiplicity constraints, a corresponding 'Parent' must also in the 'Deleted' state."}
¿Hay una manera de conseguir todas las asociaciones de esa entidad y cambiar el estado eliminado para ellos también?
Ya he intentado obtener la referencia a la entidad real asociada, pero el EntityState
de la entidad se establece en Unchanged
en lugar de Deleted
.
Creo que la asociación se marca como eliminada (las asociaciones se tratan como objetos separados en EF) pero no la entidad relacionada. Ahora cuando EF intenta eliminar la asociación, no puede porque la entidad relacionada no está marcada para eliminarse. Supongo que la clave externa no admite nulos y, por lo tanto, eliminar una entidad requiere eliminar la entidad relacionada (eliminación en cascada). Puede consultar este hilo: http://stackoverflow.com/questions/10300156/ivalidatableobject-is-useless-for-ef-navigation-properties/10304323#10304323. Puede ser útil, ya que muestra cómo llegar a los objetos relacionados. – Pawel
Fue útil para obtener los objetos relacionados, gracias. Sin embargo, cuando intento cambiar el estado de una de las relaciones, aparece un extraño error que dice "No se puede cambiar el estado de una relación si uno de los extremos de la relación es KeyEntry". – Jonathan
¿Ha visto [esta solución] (http://connect.microsoft.com/VisualStudio/feedback/details/513174/unable-to-refresh-some-items-in-the-objectcontext)? –