Entity Framework: ciclo de vida
Toda la vida
La vida útil de un contexto comienza cuando se crea la instancia y finaliza cuando la instancia se elimina o se recolecta como basura.
La duración del contexto es una decisión muy importante que debemos tomar cuando utilizamos ORM.
El contexto funciona como un caché de entidad, por lo que significa que contiene referencias a todas las entidades cargadas que pueden crecer muy rápidamente en el consumo de memoria y también pueden causar pérdidas de memoria.
En el diagrama a continuación, puede ver el nivel superior del flujo de trabajo de datos desde la aplicación a la base de datos a través de Contexto y viceversa.
Ciclo de vida de la entidad
El ciclo de vida de la entidad describe el proceso en el que una entidad se crea, agrega, modifica, elimina, etc. Las entidades tienen muchos estados durante su vida. Antes de ver cómo recuperar el estado de la entidad, echemos un vistazo a qué es el estado de la entidad. El estado es una enumeración de tipoSystem.Data.EntityState que declara los siguientes valores:
Added: La entidad se marca como agregada.
Deleted: La entidad está marcada como eliminada.
Modified: La entidad ha sido modificada.
Unchanged: La entidad no ha sido modificada.
Detached: La entidad no se rastrea.
Cambios de estado en el ciclo de vida de la entidad
A veces, el estado establece automáticamente el estado de las entidades, pero el desarrollador también puede modificarlo manualmente. Aunque todas las combinaciones de cambios de un estado a otro son posibles, algunas de ellas carecen de sentido. Por ejemplo,Added entidad a la Deleted estado, o viceversa.
Discutamos sobre diferentes estados.
Estado sin cambios
Cuando una entidad no cambia, está vinculada al contexto pero no se ha modificado.
De forma predeterminada, una entidad recuperada de la base de datos se encuentra en este estado.
Cuando una entidad se adjunta al contexto (con el método Attach), de manera similar se encuentra en el estado Sin cambios.
El contexto no puede realizar un seguimiento de los cambios en los objetos a los que no hace referencia, por lo que cuando se adjuntan, se supone que no han cambiado.
Estado independiente
Separado es el estado predeterminado de una entidad recién creada porque el contexto no puede rastrear la creación de ningún objeto en su código.
Esto es cierto incluso si crea una instancia de la entidad dentro de un bloque de uso del contexto.
Separado es incluso el estado de las entidades recuperadas de la base de datos cuando el seguimiento está deshabilitado.
Cuando una entidad está separada, no está vinculada al contexto, por lo que no se realiza un seguimiento de su estado.
Puede eliminarse, modificarse, usarse en combinación con otras clases o usarse de cualquier otra manera que pueda necesitar.
Debido a que no hay un seguimiento de contexto, no tiene ningún significado para Entity Framework.
Estado agregado
Cuando una entidad está en el estado Agregado, tiene pocas opciones. De hecho, solo puede separarlo del contexto.
Naturalmente, incluso si modifica alguna propiedad, el estado permanece Agregado, porque moverlo a Modificado, Sin cambios o Eliminado no tiene sentido.
Es una entidad nueva y no tiene correspondencia con una fila en la base de datos.
Este es un requisito previo fundamental para estar en uno de esos estados (pero el contexto no aplica esta regla).
Estado modificado
Cuando se modifica una entidad, eso significa que estaba en estado Sin cambios y luego se cambió alguna propiedad.
Una vez que una entidad entra en el estado Modificado, puede pasar al estado Separado o Eliminado, pero no puede volver al estado Sin cambios incluso si restaura manualmente los valores originales.
Ni siquiera se puede cambiar a Agregado, a menos que separe y agregue la entidad al contexto, porque ya existe una fila con este ID en la base de datos y obtendría una excepción de tiempo de ejecución cuando la persista.
Estado eliminado
Una entidad entra en el estado Eliminado porque no se modificó o modificó y luego se utilizó el método DeleteObject.
Este es el estado más restrictivo, porque no tiene sentido cambiar de este estado a cualquier otro valor que no sea Separado.
los usingdeclaración si desea que todos los recursos que controla el contexto se eliminen al final del bloque. Cuando usa elusing declaración, luego el compilador crea automáticamente un bloque de prueba / finalmente y llama a dispose en el bloque finalmente.
using (var context = new UniContext()) {
var student = new Student {
LastName = "Khan",
FirstMidName = "Ali",
EnrollmentDate = DateTime.Parse("2005-09-01")
};
context.Students.Add(student);
context.SaveChanges();
}
Cuando trabaje con un contexto de larga duración, considere lo siguiente:
A medida que carga más objetos y sus referencias en la memoria, el consumo de memoria del contexto puede aumentar rápidamente. Esto puede causar problemas de rendimiento.
Recuerde deshacerse del contexto cuando ya no sea necesario.
Si una excepción hace que el contexto esté en un estado irrecuperable, toda la aplicación puede terminar.
Las posibilidades de encontrarse con problemas relacionados con la simultaneidad aumentan a medida que aumenta la brecha entre el momento en que se consultan y se actualizan los datos.
Cuando trabaje con aplicaciones web, use una instancia de contexto por solicitud.
Cuando trabaje con Windows Presentation Foundation (WPF) o Windows Forms, use una instancia de contexto por formulario. Esto le permite utilizar la funcionalidad de seguimiento de cambios que proporciona el contexto.
Reglas de juego
Web Applications
Ahora es una práctica común y recomendada que para las aplicaciones web, el contexto se utilice por solicitud.
En las aplicaciones web, nos ocupamos de las solicitudes que son muy cortas pero que contienen todas las transacciones del servidor, por lo que tienen la duración adecuada para que viva el contexto.
Desktop Applications
Para aplicaciones de escritorio, como Win Forms / WPF, etc., el contexto se usa por formulario / diálogo / página.
Como no queremos tener el contexto como un singleton para nuestra aplicación, lo eliminaremos cuando pasemos de un formulario a otro.
De esta manera, obtendremos muchas de las habilidades del contexto y no sufriremos las implicaciones de contextos de larga duración.