我得到了这个错误:
The ObjectContext instance has been disposed and can no
longer be used for operations that require a connection.我明白为什么我会犯这个错误。然而,我不明白的是,为什么一种情况会导致错误,而另一种情况则不会。以下是这两种情况。
案例一(导致错误):
List<SomeObject> someobjects;
using (var gm = new GenericRepository<SomeObject>())
{
someobjects = gm.Get().ToList();
}
vm.SomeObjectSelectList = slf.getSpecificList(someobjects);这里所做的是使用通用存储库从数据库中填充一个List<>。然后,将列表发送到工厂(slf),以创建视图模型(vm)中使用的选择列表。当以这种方式使用时,会出现上述错误。原因是工厂内部有这一行代码:
w => w.Date + " " + w.Child.FirstName + " " + w.Child.LastName);虽然someobjects的列表发送得很好,但它的嵌套对象没有发送,当调用.Child时,会调用db上下文并导致错误。
案例二(不引起错误):
List<SomeObject> someobjects;
using (var gm = new GenericRepository<SomeObject>())
{
someobjects = gm.Get().ToList();
vm.SomeObjectSelectList = slf.getSpecificList(someobjects);
}在这种情况下,不会导致错误。但是,从第一种情况来看,显然正在与数据库上下文联系。
当上下文位于存储库中时,工厂如何访问上下文?
发布于 2012-03-17 21:20:21
工厂没有对上下文的访问权--当您第一次访问属性值时,是someobjects在内部使用上下文来检索属性值。由于您的上下文是在using块之后释放的,因此尝试访问这些属性将引发异常。
您可以想象,例如,Child属性实现如下所示:
private Person _child = null;
public Person Child
{
get
{
return _child ?? GetandSetChildFromContext();
}
}只有在需要时才从上下文中延迟检索Child的值--如果您想要热切地包含相关属性,使用Include()查询--这是明智的,即如果您已经知道每次都需要某些相关属性。这有点困难,因为您在EF之上使用了存储库层--确保存储库支持包含查询。
发布于 2012-03-17 21:24:40
问题是using语句释放您的对象,当您说someobjects = gm.Get().ToList()时,它不会复制它,但是如果您想使它工作(例如,1),则只需使用一个引用,您就必须将对象克隆到一个新实例中。
发布于 2012-03-17 21:25:55
该实体通过延迟加载检索子数据。
https://stackoverflow.com/questions/9753726
复制相似问题