5
votes

When showing my main window, I make a list of objects from linq-to-sql:

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

Now, when I doubleclick an item in my list, I want to use the selected object in a new usercontrol:

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

Now, this results in an exception:

System.ObjectDisposedException was unhandled
Message="Cannot access a disposed object.\r\nObject name: 'DataContext accessed after Dispose.'."
Source="System.Data.Linq"
ObjectName="DataContext accessed after Dispose."

I guess this comes as a result of binding a list to the shows season-list, and the season-list needs to be populated or something:

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

Now, what I would like to know, is how this is supposed be done? Would I need to make a new DataContext-object and retrieve the selected show again, or is it possible to re-conntect my show with a new datacontext to populate the seasons-list?

I guess I'm a little lost....

4
WPF or Silverlight please add relevant tag? - AnthonyWJones

4 Answers

10
votes

Do not use a "using" statement with your datacontext. Please refer to this post: Disposing DataContext

5
votes

When you use a using() block, it calls Dispose() on whatever you've put into its initializer (in this case, your context). When a LINQ to SQL context is disposed, the entities created with it are as well. I would suggest creating an instance variable on your Form for the context, and insert code into your Form's Dispose(bool) function (it's in the Designer.cs file) to dispose of the context.

1
votes

Is there a reason you can't maintain the DataContext object for longer, hold it perhaps as Resource in the page. Ordinarily you wouldn't want a DataContext living too long however if it used only for queries relevant to the current page and is disposed with the page that may be a good compromise.

You would want to be careful in a multi-user environment where the backend values represented in the Datacontext change quickly. However I would think that TV Schedules don't keep changing rapidly.

0
votes

Actually there are valid reasons to use those objects apart from the datacontext. what about passing the objects back to a web service call?