5

当显示我的主窗口时,我列出了来自 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="Dispose 后访问的 DataContext。"

我想这是将列表绑定到节目季列表的结果,并且需要填充季列表或其他内容:

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

现在,我想知道,这应该怎么做?我是否需要创建一个新的 DataContext 对象并再次检索选定的节目,或者是否可以使用新的数据上下文重新连接我的节目以填充季节列表?

我想我有点迷路了......

4

4 回答 4

10

不要在数据上下文中使用“使用”语句。请参考这篇文章:Disposing DataContext

于 2009-04-21T18:14:53.667 回答
5

当您使用一个using()块时,它会调用Dispose()您放入其初始化程序中的任何内容(在本例中为您的上下文)。当一个 LINQ to SQL 上下文被释放时,用它创建的实体也是如此。我建议在您Form的上下文中创建一个实例变量,并将代码插入您的FormDispose(bool)函数(它在Designer.cs文件中)以处理上下文。

于 2009-04-21T18:16:55.657 回答
1

是否有原因您不能更长时间地维护 DataContext 对象,可能将其作为页面中的资源保存。通常,如果 DataContext 仅用于与当前页面相关的查询并且与可能是一个很好的折衷方案的页面一起处理,您通常不希望 DataContext 存在太久。

在 Datacontext 中表示的后端值快速变化的多用户环境中,您需要小心。但是我认为电视节目表不会保持快速变化。

于 2009-04-21T18:51:39.910 回答
0

实际上,除了数据上下文之外,还有正当理由使用这些对象。将对象传递回 Web 服务调用怎么样?

于 2009-06-04T16:11:54.467 回答