C # Linq-to-Sql: si se debe eliminar DataContext con IDisposable
-
03-07-2019 - |
Pregunta
Tengo varios métodos que tratan con la base de datos y todos comienzan por llamar
FaierDbDataContext db = new FaierDbDataContext();
Dado que el objeto Linq2Sql DataContext implementa IDisposable, ¿debería usarse con " utilizando " ;?
using (FaierDbDataContext db = new FaierDbDataContext()) {
// use db here
}
¿Cuáles son las implicaciones de usarlo de una manera u otra?
Solución
A diferencia de la mayoría de los tipos que implementan IDisponible, DataContext no Realmente necesito disponer, al menos no en la mayoría de los casos. Le pregunte a Matt Warren sobre esta decisión de diseño, y aquí fue su respuesta:
Hay algunas razones por las que implementamos IDisponible:
- Si la lógica de la aplicación necesita aferrarse a una entidad más allá de cuando Se espera que DataContext sea utilizado o válido puede hacer cumplir ese contrato por llamando a Disposición. Cargadores diferidos en esa entidad seguirá haciendo referencia El DataContext e intentará usarlo si algún código intenta navegar por el Propiedades diferidas. Estos intentos fallará. Disponer también obliga al DataContext para volcar su caché de Entidades materializadas para que una sola. entidad en caché no lo hará accidentalmente mantener vivas todas las entidades materializadas a través de ese DataContext, que haría de lo contrario causar lo que parece ser una pérdida de memoria.
- La lógica que cierra automáticamente la conexión de DataContext puede ser engañado para dejar la conexión abierto. El DataContext se basa en el código de aplicación enumerando todos Los resultados de una consulta desde llegar a el final de un conjunto de resultados desencadena la Conexión para cerrar. Si el La aplicación utiliza IEnumerable Método MoveNext en lugar de un foreach declaración en C # o VB, puede salir La enumeración prematuramente. Si tu aplicación experimenta problemas con las conexiones no se cierran y tu Sospechar el comportamiento de cierre automático. No está funcionando puedes usar el Dispose patrón como un trabajo alrededor.
de la fuente
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow