Ошибка доступа к ObjectContext - PullRequest
0 голосов
/ 18 марта 2012

Я получаю эту ошибку:

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);

Хотя список некоторых объектов отправляется просто отлично, его вложенные объекты - нет, и когда вызов .Child называетсяВызывается контекст базы данных и вызывается ошибка.

Случай два (не вызывает ошибки):

        List<SomeObject> someobjects;
        using (var gm = new GenericRepository<SomeObject>())
        {
            someobjects = gm.Get().ToList();
            vm.SomeObjectSelectList = slf.getSpecificList(someobjects);
        }

В этом случае ошибка не вызывается.Однако из первого случая очевидно, что с базой данных связываются.

Как фабрика имеет доступ к контексту, когда контекст находится внутри хранилища?

Ответы [ 4 ]

2 голосов
/ 18 марта 2012

Фабрика не имеет доступа к контексту - это someobjects, который внутренне использует контекст для получения значений свойств при первом обращении к ним.Поскольку ваш контекст располагается после использования блока, попытка получить доступ к свойствам вызовет исключение.

Вы можете представить, например, реализацию свойства Child примерно так:

private Person _child = null;
public Person Child
{
    get
    {
        return _child ?? GetandSetChildFromContext();
    }
}

Значение Child извлекается из контекста лениво, только когда это необходимо - если вы хотите быстро включить связанные свойства, используйте запрос Include() - это целесообразно, т. Е. Если вы уже знаете, что вам понадобятся определенные связанные свойства каждый раз,Это несколько усложняется тем фактом, что вы используете слой хранилища поверх EF - убедитесь, что хранилище поддерживает запросы включения.

1 голос
/ 18 марта 2012

Вместо создания экземпляра репозитория в одном методе, где его область действия ограничена, вы можете создать экземпляр как закрытый член класса контроллера и вы можете разместить репозиторий внутри метода контроллера OnDispose, который обеспечит надлежащую обработку вашего репозитория.

1 голос
/ 18 марта 2012

Объект извлекает дочерние данные посредством отложенной загрузки.

1 голос
/ 18 марта 2012

Проблема в том, что оператор using располагает ваш объект и когда вы говорите someobjects = gm.Get().ToList(); он не будет копировать его, а просто использует ссылку, если вы хотите, чтобы он работал, например, для работы 1, вам придется клонировать объект в новый экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...