[ES] Ese Disposed enamorado de la luna

En mi último proyecto laboral nos hacía falta guardar una serie de datos en un Windows Phone 8.1. Cómo las universal apps han salido todavía sin una versión estable de Sqlite nos hemos inclinado entonces por usar SqlServerCE que viene integrado en las WP8.1 Silverlight Apps.

De modo que me he puesto manos a la obra y a generar un DataContext manualmente (dado que no tiene editor visual y no se pueden generar dbml… punto que sigo sin entender porqué…). Al acabar de declarar las tablas me he puesto con sus relaciones y he establecido una relación 1-N entre dos tablas.

Usaré el mismo ejemplo que en la consulta que hice en el foro de MSDN (al que desde aquí os ayudo a fomentar y colaborar, ¡Haced comunidad copón!) de modo que la idea es tener una lista de Productos y luego una de Categorías y un producto puede pertenecer a más de una categoría. Todo muy claro en las decenas de comentarios que se puede encontrar por google.

Llegados a este punto e intentando encapsular todo el funcionamiento del DataContext de forma que para mis compañeros fuese una caja negra de la que no tuvieran que preocuparse lo que sucede dentro a la hora de realizar las peticiones de datos, en uno de los primeros test, cree una función que devolvía la lista de productos:

Hasta ahí todo bien, todos los campos eran accesibles sin aparente problema, hasta que intenté recuperar las categorías, momento en el que me encontré con el siguiente mensaje.

‘n._Categorias.Count’ threw an exception of type ‘System.ObjectDisposedException’ int {System.ObjectDisposedException}

Ojo Peligro!!!

¿Qué estoy haciendo mal? ¿Porque sufro el ataque de los dioses del disposed?

No pasa nada hombre! Lo único que eres un gañán y has pasado por alto cosas básicas que sabías de funcionamiento. Una de ellas es que el toList() devuelve una lista de elementos que es IQueryable y que por lo tanto se ejecuta cuando es necesaria, pero claro, si esa lista está basada en un contexto de datos e intentas recuperar los datos cuando ya se ha hecho el Dispose del contexto que utilizabas es probable (sólo probable) que no sea ya accesible el mismo y por lo tanto no pueda recuperar tu lista anidada

Para solucionarlo basta con ser un poquito más curioso y no hacer las cosas deprisa y corriendo. Yo me he decantado por un objeto intermedio (diferente al que compone la tabla de la base de datos pero que hereda de esa clase para que mantenga el formato) y volcar los datos básicos y la lista de las categorías antes de devolverle el resultado fuera de mi pequeña caja negra.