Siendo nuevo en Entity Framework, estoy bastante atascado en cómo proceder con este conjunto de problemas. En el proyecto en el que estoy trabajando actualmente, todo el sitio está muy integrado con el modelo EF. Al principio, el acceso al contexto EF se controlaba con un bootstrapper de Dependency Injection. Por razones operacionales, no pudimos usar una biblioteca DI. Eliminé esto y usé un modelo de instancias individuales del objeto de contexto donde fue requerido. Empecé a recibir la siguiente excepción:.NET Entity Framework y transacciones
El tipo 'XXX' se ha mapeado más de una vez.
Llegamos a la conclusión de que las diferentes instancias del contexto estaban causando este problema. Luego resumí el objeto de contexto en una única instancia estática a la que accedía cada hilo/página. Ahora obtengo una de varias excepciones sobre transacciones:
No se permite la nueva transacción porque hay otros hilos que ejecutan en la sesión.
La operación de transacción no se puede realizar porque hay solicitudes pendientes trabajando en esta transacción.
ExecuteReader requiere el comando de tener una transacción cuando la conexión asignado al comando está en una transacción local pendiente. La propiedad de transacción del comando no se ha inicializado.
La última de estas excepciones se produjo en una operación de carga. No estaba tratando de guardar el estado del contexto en el Db en el hilo que falló. Sin embargo, había otro hilo que realizaba una operación de este tipo.
Estas excepciones son intermitentes en el mejor de los casos, pero he logrado que el sitio entre en un estado en el que se rechazaron conexiones nuevas debido a un bloqueo de transacción. Desafortunadamente no puedo encontrar los detalles de la excepción.
Supongo que mi primera pregunta es, ¿debería usarse el modelo EF desde una única instancia estática? Además, ¿es posible eliminar la necesidad de transacciones en EF? He intentado usar un objeto TransactionScope
sin éxito ...
Para ser honesto, estoy un montón pegado aquí, y no puedo entender por qué (lo que debería ser) las operaciones bastante simples están causando un problema tal ...
Relacionados: http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why – Steven
Es una lástima que no se pueda usar un bootstrapper de IOC, porque la solución con [Ninject] (http : //www.ninject.org/) sería vincular una instancia "común" al _cance scope_, como otros han sugerido: 'kernel.Bind>(). Para > () .InRequestScope(); '- siendo la parte importante **' InRequestScope' ** –
drzaus