Diferencia entre .Remove() & .DeleteObject() | Entity Framework Core

Mientras la primera es en si una colección del EntityCollection y el segundo es del ObjectContext, ¿cuando? se debe utilizar cada uno, ¿Existe? una preferencia sobre el otro.

Para explicar la Diferencia entre .Remove() & .DeleteObject() en el Entity Framework desde las ultimas incluyendo la Core, recordemos que podemos eliminar un elemento de una base de datos usando Entity Framework utilizando los dos métodos siguientes:

 

Mientras que Remove() devuelve una bool y DeleteObject() nos retorna void.

No es generalmente correcta que se puede “eliminar un elemento de una base de datos” con ambos métodos. Primero definamos los conceptos involucrados.

El método EntityCollection.Remove() también elimina la relación entre el objeto de origen y el objeto que se quita de la colección. Si la relación tiene una restricción de integridad referencial, llamar al método Remove() en un objeto dependiente marca tanto la relación como el objeto dependiente para su eliminación. Esto ocurre porque la restricción indica que el objeto dependiente no puede existir sin una relación con el padre. (Debe existir la integridad referencial con el padre para que suceda, indicando que no permite Padres Sin hijos)

EntityCollection.Remove(): Elimina un objeto de la colección y marca también la relación para su eliminación.

 

El Método ObjectContext.DeleteObject() Marca un objeto para la eliminación de ObjectStateManager. El objeto se elimina en el origen de datos cuando se llama al método SaveChanges.
La eliminación del objeto primario también elimina todos los objetos secundarios en la relación restringida. Este resultado es el mismo que habilitar la propiedad CascadeDelete en la asociación para la relación.
El método DeleteObject también puede ser llamado sobre objetos que ya se han definido para su eliminación, con el objetivo de Provocar un CascadeDelete.

ObjectContext.DeleteObject(): Marca un objeto para su eliminación.

Para tratar de ahondar en el tema, es así:

  • ObjectContext.DeleteObject(entity) marca la entidad como Deleted en el contexto. (Si después de el Deleted en un EntityState) se llama al SaveChanges el EF envía una declaración SQL de DELETE a la base de datos. Si no se violan las restricciones de referencia en la base de datos se borrará la entidad, de lo contrario se produce una excepción.
  • EntityCollection.Remove(childEntity) marca la relación entre el padre y childEntity como Deleted. Si la childEntity (hijo) en si misma se elimina de la base de datos lo qué le suceda exactamente cuando se llame a SaveChanges, dependerá del tipo de relación entre los dos:
    • Si la relación es opcional , es decir, la clave externa que hace referencia desde el hijo al padre en la base de datos permite un NULL en los valores, se establecerá en la FK un NULL y si se llama a SaveChanges este tendrá el valor de NULL asociado a la relación childEntity, posteriormente se escribirá en la base de datos (es decir, la relación entre los dos se elimina). Esto sucede con una instrucción SQL de UPDATE. Sin ninguna declaración producida de DELETE.
    • Si es la relación Necesaria & No Identificada (el FK no permite NULL valores) y la relación es no identificada (lo que significa que la clave externa no es parte de la llave principal “llave del registro hijo”) hay que agregar el hijo a otro padre o usted tiene que eliminar de forma explícita el registro hijo (notificando a DeleteObject). Si no lo hace, en cualquiera caso se producirá un error de excepción de violación de referencia en el EF cuando se llame a SaveChanges.
    • Si la relación se Necesaria & Identifica (está necesariamente se requiere, ya que cualquier parte de la llave principal no puede ser NULL) EF marcará el childEntity con Deleted. Si se llama a SaveChanges una declaración SQL DELETE se enviará a la base de datos. Si no se infrinjen otras restricciones de referencia en la base de datos se borrará la entidad, de lo contrario se produce una excepción.

 

Conclusiones


ObjectContext.DeleteObject (Utilizando un Entity) marca la entidad como Deleted en el contexto. (En EntityState se elimina después de eso.) Si despues llama a SaveChanges el EF envía una instrucción SQL DELETE a la base de datos. Si no se violan las restricciones referenciales en la base de datos, se eliminará la entidad, de lo contrario se producirá una excepción. Suele ser ocupado para Hacer borrados puntuales cuando se tiene claramente identificado el Entity.

EntityCollection.Remove (Utilizando un childEntity) marca la relación entre parent y childEntity como Deleted. Si childEntity se elimina de la base de datos, lo que exactamente sucede cuando llama SaveChanges depende del tipo de relación entre los dos. Puede ser ocupado para hacer borrados puntuales pero nos brinda facilidades para borrar Relaciones completas de registros a partir de un hijo.

 

 

Estudiante de la vida, buscando aprender…
Tu solo pregunta, si no tengo la respuesta… ya NO preguntaras solo…

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *