mvc framework first example create code and c# entity-framework garbage-collection dbcontext using-statement

c# - framework - Uso de EF(entidad marco) de la declaración "using"



entity framework example (2)

Creo que encontrarás muchos que sugieren este estilo de patrón. No solo yo o el manejo de Henk DBContext

  • Sí, lo ideal sería utilizar sentencias para subtipos DBContext
  • Incluso mejores patrones de unidad de trabajo que se administran con el uso, que tienen un contexto y eliminan el contexto. Solo uno de muchos ejemplos de UOW, este de Tom Dykstra.
  • El administrador de la unidad de trabajo debe ser nuevo cada solicitud de HTTP
  • El contexto NO es seguro para subprocesos, así que asegúrese de que cada subproceso tenga su propio contexto.
  • Deje que EF guarde las cosas detrás de escena.
  • Probar tiempos de creación de contexto. después de varios Http solicitud. ¿Todavía tienes una preocupación?
  • Espere problemas si almacena el contexto en estático. cualquier tipo de acceso concurrente le dolerá y si está utilizando llamadas AJAX paralelas, suponga un 90% de posibilidades de problemas si usa un contexto único estático.

Para algunos consejos de rendimiento, vale la pena leerlo

Tengo un proyecto en MVC. Elegimos EF para nuestras transacciones DB. Creamos algunos administradores para la capa BLL. Encontré muchos ejemplos, donde se using declaración " using ", es decir,

public Item GetItem(long itemId) { using (var db = new MyEntities()) { return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault(); } }

Aquí creamos una nueva instancia de DBcontext MyEntities() . Usamos " using " para "asegurar el uso correcto de objetos IDisposable".

Es solo un método en mi administrador. Pero tengo más de diez de ellos. Cada vez que llamo a cualquier método del administrador, usaré " using " statemant y crearé otro DBcontext en la memoria. Cuando el recolector de basura (GC) los desechará? ¿Quién sabe?

Pero hay otra alternativa de uso de los métodos de administrador. Creamos una variable global:

private readonly MyEntities db = new MyEntities();

y use DBcontext en cada método sin la declaración " using ". Y el método se ve así:

public Item GetItem(long itemId) { return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault(); }

Preguntas:

  1. ¿Cuál es la forma correcta de usar la variable DBcontext?
  2. ¿Qué pasa si no usamos la declaración de " usage " (porque afecta el rendimiento)? ¿GC hará todo para eso?

Soy un "novato" en el uso de EF y todavía no he encontrado la respuesta unívoca para esta pregunta.


La forma correcta o mejor práctica de usar la variable DBContext es con el uso.

using (var db = new MyEntities()) { return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault(); }

El beneficio es que muchas cosas se hacen automáticamente por nosotros. Por ejemplo, una vez que se completa el bloque de código, se llama al desecho.

Por MSDN EF Trabajando con DbContext

La duración del contexto comienza cuando se crea la instancia y finaliza cuando la instancia se elimina o se recolecta. Use using si desea disponer de todos los recursos que el contexto controla al final del bloque. Cuando usa using, el compilador crea automáticamente un bloque try / finally y las llamadas se deshacen en el bloque finally.