MVC 3 + EF 4.1¿Cuál es la mejor manera de crear instancias y eliminar DbContext en MVC?
estoy eligiendo entre dos enfoques para hacer frente a DbContext:
- Instantiate en
Application_BeginRequest
, ponerlo enHttpContext.Current.Items
y disponer enApplication_EndRequest
. - Crear desechable UnitOfWork (envoltorio tipode para
DbContext
) y empezar cada acción del controlador conusing(var unitOfWork = new UnitOfWork()) { ... }
Comparte tu experiencia por favor: ¿Cuál prefiere? ¿Cuáles son los pros y los contras de cada enfoque?
Usar el enfoque de bloques tiene algunas desventajas. Causa muchos viajes redondos a la base de datos y uso indebido de transacciones en el marco de la Entidad. consulte http://ayende.com/blog/4775/new-profiler-feature-avoid-writes-from-multiple-sessions-in-the-same-request – marvelTracker
¿Por qué causa más viajes de ida y vuelta?Se supone que una solicitud http debe ejecutar una acción en la mayoría de los casos, por lo que si ajusta el código de la acción completa en este bloque de uso, no habría más solicitudes de base de datos en comparación con la primera aproximación. La otra cosa con el enfoque 'por acción' es que siempre debe tener en cuenta un ámbito en el que se puede invocar la base de datos y colocar el bloque de manera apropiada. Por ejemplo, si su modelo contiene alguna colección para ser cargada de forma diferida en una representación de Vista de tiempo, la declaración que devuelve Vista (Modelo) debe estar dentro del bloque. – YMC
Si usa DbContext en la envoltura de la capa de controlador con UnitOfWork crea una fuerte dependencia en la capa de interfaz de usuario y su enfoque de base de datos. Entonces necesitas una capa de servicio y una capa de repositorio. Después de eso, si tus repositorios tienen UnitOfWork por separado con el uso de bloques, eso será un problema. porque todos y cada uno de los repositorios crean transacciones y viajes innecesarios de ida y vuelta a la base de datos. Ver el enlace de arriba para más detalles. Si está seguro acerca de una llamada de servicio por solicitud, entonces puede usar la unidad de trabajo dentro del método de servicio. Sin embargo, no es garantía. – marvelTracker