在显示我的主窗口时,我从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对象名称:'在Dispose之后访问DataContext。'。” 来源= “将System.Data.Linq”
ObjectName =“Dispose之后访问的DataContext。”
我想这是因为将列表绑定到节目季节列表,并且季节列表需要填充或者其他内容:
<ListBox Name="listSeasons" ItemsSource="{Binding Seasons}"/>
现在,我想知道的是,这应该怎么做? 我是否需要创建一个新的DataContext对象并再次检索所选的节目,或者是否可以使用新的datacontext重新连接我的节目以填充季节列表?
我想我有点失落......
答案 0 :(得分:10)
不要在datacontext中使用“using”语句。 请参阅此帖子:Disposing DataContext
答案 1 :(得分:5)
当您使用using()
块时,它会对您放入其初始化程序的任何内容(在本例中为您的上下文)调用Dispose()
。当处置LINQ to SQL上下文时,使用它创建的实体也是如此。我建议您在Form
上为上下文创建一个实例变量,并将代码插入For
m的Dispose(bool)
函数(它位于Designer.cs
文件中)以处理上下文。
答案 2 :(得分:1)
是否有理由不能长时间维护DataContext对象,可能将其保存为页面中的Resource。通常情况下,如果DataContext仅用于与当前页面相关的查询并且与页面一起使用可能是一个很好的折衷方案,那么您不希望DataContext过于长久。
您希望在多用户环境中小心,其中Datacontext中表示的后端值会快速更改。不过,我认为电视时间表不会持续快速变化。
答案 3 :(得分:0)
实际上除了datacontext之外,还有正当理由使用这些对象。将对象传递回Web服务调用怎么办?