首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObjectContext访问错误

ObjectContext访问错误
EN

Stack Overflow用户
提问于 2012-03-17 21:06:34
回答 4查看 365关注 0票数 0

我得到了这个错误:

代码语言:javascript
复制
The ObjectContext instance has been disposed and can no 
longer be used for operations that require a connection.

我明白为什么我会犯这个错误。然而,我不明白的是,为什么一种情况会导致错误,而另一种情况则不会。以下是这两种情况。

案例一(导致错误):

代码语言:javascript
复制
        List<SomeObject> someobjects;
        using (var gm = new GenericRepository<SomeObject>())
        {
            someobjects = gm.Get().ToList();
        }
        vm.SomeObjectSelectList = slf.getSpecificList(someobjects);

这里所做的是使用通用存储库从数据库中填充一个List<>。然后,将列表发送到工厂(slf),以创建视图模型(vm)中使用的选择列表。当以这种方式使用时,会出现上述错误。原因是工厂内部有这一行代码:

代码语言:javascript
复制
w => w.Date + " " + w.Child.FirstName + " " + w.Child.LastName);

虽然someobjects的列表发送得很好,但它的嵌套对象没有发送,当调用.Child时,会调用db上下文并导致错误。

案例二(不引起错误):

代码语言:javascript
复制
        List<SomeObject> someobjects;
        using (var gm = new GenericRepository<SomeObject>())
        {
            someobjects = gm.Get().ToList();
            vm.SomeObjectSelectList = slf.getSpecificList(someobjects);
        }

在这种情况下,不会导致错误。但是,从第一种情况来看,显然正在与数据库上下文联系。

当上下文位于存储库中时,工厂如何访问上下文?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-17 21:20:21

工厂没有对上下文的访问权--当您第一次访问属性值时,是someobjects在内部使用上下文来检索属性值。由于您的上下文是在using块之后释放的,因此尝试访问这些属性将引发异常。

您可以想象,例如,Child属性实现如下所示:

代码语言:javascript
复制
private Person _child = null;
public Person Child
{
    get
    {
        return _child ?? GetandSetChildFromContext();
    }
}

只有在需要时才从上下文中延迟检索Child的值--如果您想要热切地包含相关属性,使用Include()查询--这是明智的,即如果您已经知道每次都需要某些相关属性。这有点困难,因为您在EF之上使用了存储库层--确保存储库支持包含查询。

票数 2
EN

Stack Overflow用户

发布于 2012-03-17 21:24:40

问题是using语句释放您的对象,当您说someobjects = gm.Get().ToList()时,它不会复制它,但是如果您想使它工作(例如,1),则只需使用一个引用,您就必须将对象克隆到一个新实例中。

票数 1
EN

Stack Overflow用户

发布于 2012-03-17 21:25:55

该实体通过延迟加载检索子数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9753726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档