c #: Как передавать linq-объекты

Показывая свое главное окно, я составляю список объектов из linq-to-sql:

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

Теперь, когда я дважды щелкаю элемент в моем списке, я хочу использовать выбранный объект в новом пользовательском элементе управления:

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

Теперь это приводит к исключению:

System.ObjectDisposedException не был обработан
Message = "Невозможно получить доступ к удаленному объекту. \ R \ nИмя объекта: 'DataContext доступен после Dispose.'."
Source = "System.Data.Linq"
ObjectName = " DataContext, доступ к которому осуществляется после Dispose. "

Я предполагаю, что это происходит в результате привязки списка к сезонному списку шоу, и сезонный список должен быть заполнен или что-то в этом роде:

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

Теперь, что я хотел бы знать, как это должно быть сделано? Нужно ли мне создать новый объект DataContext и снова получить выбранное шоу, или можно повторно подключить мое шоу с новым контекстом данных для заполнения списка сезонов?

Думаю, я немного заблудился ....


person Vegar    schedule 21.04.2009    source источник
comment
WPF или Silverlight, пожалуйста, добавьте соответствующий тег?   -  person AnthonyWJones    schedule 21.04.2009


Ответы (4)


Не используйте оператор using в тексте данных. См. Это сообщение: Удаление контекста данных

person Jose Basilio    schedule 21.04.2009
comment
Я думал, что это способ использования текстов данных - создавать, использовать и удалять. Думаю, я ошибался .. :) Спасибо. - person Vegar; 21.04.2009

Когда вы используете блок using(), он вызывает Dispose() все, что вы поместили в его инициализатор (в данном случае ваш контекст). Когда контекст LINQ to SQL удаляется, объекты, созданные с его помощью, также удаляются. Я бы предложил создать переменную экземпляра в вашем Form для контекста и вставить код в вашу функцию Form Dispose(bool) (она находится в файле Designer.cs), чтобы избавиться от контекста.

person Adam Robinson    schedule 21.04.2009

Есть ли причина, по которой вы не можете поддерживать объект DataContext дольше, возможно, удерживайте его как ресурс на странице. Обычно вы бы не хотели, чтобы DataContext существовал слишком долго, если бы он использовался только для запросов, относящихся к текущей странице, и удалялся вместе со страницей, что может быть хорошим компромиссом.

Будьте осторожны в многопользовательской среде, где значения серверной части, представленные в Datacontext, быстро меняются. Однако я думаю, что телепрограммы не меняются быстро.

person AnthonyWJones    schedule 21.04.2009
comment
Неважно, быстро ли меняются данные. Единственная причина для удаления - освободить соединение с базой данных. Если я чего-то не понимаю, тогда просветите меня. - person DoctorFoo; 22.05.2009
comment
На самом деле я только что прочитал, что DataContext не поддерживает открытые соединения, поэтому нет причин для удаления, если вам не нужно чаще освобождать память, потому что DataContext будет отслеживать изменения состояния. Только долго работающие серверные приложения могут столкнуться с проблемами с отслеживанием состояния, занимающими слишком много памяти. В конце концов, сборщик мусора автоматически освободит память, поэтому избавляться от нее нужно только в том случае, если у вас есть проблемы с использованием памяти, и это может помочь оптимизировать работу. - person DoctorFoo; 22.05.2009

На самом деле есть веские причины использовать эти объекты отдельно от контекста данных. как насчет передачи объектов обратно вызову веб-службы?

person Community    schedule 04.06.2009