Para una aplicación utilizando código de Primera EF 5 beta que tienen:¿Puede EF eliminar automáticamente los datos que quedan huérfanos, donde no se elimina el padre?
public class ParentObject
{
public int Id {get; set;}
public virtual List<ChildObject> ChildObjects {get; set;}
//Other members
}
y
public class ChildObject
{
public int Id {get; set;}
public int ParentObjectId {get; set;}
//Other members
}
Las operaciones CRUD relevantes son realizadas por los repositorios, cuando sea necesario.
En
OnModelCreating(DbModelBuilder modelBuilder)
los he establecido:
modelBuilder.Entity<ParentObject>().HasMany(p => p.ChildObjects)
.WithOptional()
.HasForeignKey(c => c.ParentObjectId)
.WillCascadeOnDelete();
lo tanto, si se elimina un ParentObject
, sus ChildObjects también lo son.
Sin embargo, si funciono:
parentObject.ChildObjects.Clear();
_parentObjectRepository.SaveChanges(); //this repository uses the context
tengo la excepción:
pudo realizar la operación: La relación no podía ser cambiado debido a una o más de las propiedades de clave externa no es -nullible Cuando se realiza un cambio en una relación, la propiedad de clave foránea relacionada se establece en un valor nulo. Si la clave externa no admite valores nulos, se debe definir una nueva relación, se debe asignar a la propiedad de clave externa otro valor no nulo o se debe eliminar el objeto no relacionado.
Esto tiene sentido ya que la definición de las entidades incluye la restricción de la clave externa que se está rompiendo.
¿Puedo configurar la entidad para que se "limpie" cuando quede huérfana o debo eliminar manualmente estos ChildObject
del contexto (en este caso usando un RepositorioDeObjetos).
Afortunadamente, el equipo de EF [sabe de esto] (http://blog.oneunicorn.com/2012/06/02/deleting-orphans-with-entity-framework/) y es probable que llegar a una solución incorporada que no requiere modificar las partes internas – PinnyM