2009-04-21 13 views
5

Al mostrar la ventana principal, haga una lista de objetos de LINQ to SQL:C#: Cómo pasar LINQ objetos alrededor

using (var context = new Data.TVShowDataContext()) 
{ 
    Shows = new ObservableCollection<Data.Show>(context.Shows); 
    listShows.ItemsSource = Shows; 
} 

Ahora, cuando DoubleClick un elemento en mi lista, desea utilizar el objeto seleccionado en un nuevo control de usuario:

ShowEpList epList = new ShowEpList(); 
epList.DataContext = (Data.Show)listShows.SelectedItem; 

Ahora, esto resulta en una excepción:

System.ObjectDisposedException fue controlada
Mensaje = "No se puede acceder a un objeto eliminado. \ R \ nNombre de objeto: 'DataContext se accede después de Eliminar'."
Fuente = "System.Data.Linq"
ObjectName = "DataContext accedido después de la eliminación."

creo que esto es el resultado de la unión de una lista para la temporada de lista de espectáculos, y la lista de la temporada tiene que ser pobladas o algo:

<ListBox Name="listSeasons" ItemsSource="{Binding Seasons}"/> 

Ahora, lo que me gustaría ¿Sabes cómo se supone que se haga? ¿Tendría que crear un nuevo DataContext-object y recuperar el programa seleccionado nuevamente, o es posible volver a conectar mi programa con un nuevo contexto de datos para llenar la lista de temporadas?

Creo que estoy un poco perdido ....

+0

WPF o Silverlight Agregue una etiqueta relevante? – AnthonyWJones

+0

Lo siento. Es WPF. – Vegar

Respuesta

10

No utilice un "uso" declaración con su DataContext. Por favor remítase a este post: Disposing DataContext

+3

Pensé que esta era la forma de usar datacontexts: crear, usar y eliminar. Creo que estaba equivocado ... :) Gracias. – Vegar

5

Cuando se utiliza un bloque using(), llama Dispose() en lo que has puesto en su inicializador (en este caso, su contexto). Cuando se elimina un contexto LINQ to SQL, las entidades creadas con él también lo son. Sugeriría crear una variable de instancia en su contexto Form e insertar código en la función For m Dispose(bool) (está en el archivo Designer.cs) para eliminar el contexto.

1

¿Hay alguna razón por la que no puede mantener el objeto DataContext durante más tiempo? Manténgalo tal vez como Recurso en la página. Sin embargo, normalmente no desearía que un DataContext viviera demasiado tiempo si solo se utiliza para consultas relevantes a la página actual y se elimina con la página que puede ser un buen compromiso.

Desea tener cuidado en un entorno multiusuario donde los valores del servidor representados en el contexto de datos cambian rápidamente. Sin embargo, creo que los horarios de TV no cambian rápidamente.

+0

No importa si los datos cambian rápidamente. La única razón para deshacerse es liberar una conexión de base de datos. A menos que haya algo que no entiendo, en cuyo caso, ilumíname. –

+0

De hecho, acabo de leer que DataContext no mantiene las conexiones abiertas, por lo que no hay motivos para deshacerse, a menos que necesite liberar memoria con mayor frecuencia, porque DataContext rastreará los cambios de estado.Solo las aplicaciones de servidor de larga ejecución pueden tener problemas con el seguimiento de estado que ocupa demasiada memoria. Eventualmente, el GC liberará la memoria automáticamente, por lo que solo tendrá que deshacerse de ella si tiene problemas con el uso de la memoria y esto puede ayudar a optimizar las cosas. –

0

En realidad hay razones válidas para usar esos objetos aparte del contexto de datos. ¿Qué hay de pasar los objetos a una llamada de servicio web?

Cuestiones relacionadas