2009-05-04 4 views
27

Tengo varios métodos que se ocupan de DB y todos ellos empezar llamandoC# LINQ to SQL - En caso de DataContext eliminarse utilizando IDisposable

FaierDbDataContext db = new FaierDbDataContext(); 

Puesto que el objeto Linq2Sql DataContext implementa IDisposable, si esto se usa con "usar"?

using (FaierDbDataContext db = new FaierDbDataContext()) { 
    // use db here 
} 

¿Cuáles son las implicaciones de usarlo de una forma u otra?

+8

Además, una nota al margen, para las personas que utilizan LINQ no debe tener una variable de instancia de su DataContext para su clase de modelo de datos. En su lugar, declare uno cada vez que lo necesite en sus métodos. – mmcdole

Respuesta

29

A diferencia de la mayoría de los tipos que implementan IDisposable , DataContext no se necesita disponer realidad - al menos no en la mayoría de los casos . Le pregunté a Matt Warren acerca de esta decisión de diseño, y aquí fue su respuesta:

Hay algunas razones que implementamos IDisposable:

  • Si la lógica de aplicación tiene que aferrarse a una entidad más allá de cuando el Se espera que DataContext se use o válido. Puede hacer cumplir ese contrato llamando al Dispose. Los cargadores diferidos en esa entidad seguirán haciendo referencia al DataContext e intentarán usarlo si algún código intenta navegar por las propiedades diferidas . Estos intentos fallarán. Disponer también obliga a los DataContext para volcar su caché de materializada entidades para que una sola entidad en caché no por casualidad mantendrá con vida a todas las entidades materializadas a través que DataContext, lo que sería de otro modo causar lo que parece ser una fuga memoria.
  • La lógica que cierra automáticamente la conexión de DataContext puede ser engañada para dejar abierta la conexión . El DataContext se basa en el código de la aplicación que enumera todos los resultados de una consulta, ya que al llegar a al final de un conjunto de resultados se inicia la conexión para cerrar. Si la aplicación utiliza el método IEnumerable MoveNext en lugar de una instrucción foreach en C# o VB, puede salir de la enumeración prematuramente. Si su aplicación tiene problemas con las conexiones que no se cierran y usted sospecha que el comportamiento de cierre automático no funciona, puede utilizar el patrón Eliminar para solucionar el problema.

del source