Ленивая загрузка Entity Framework не работает из другого потока - PullRequest
7 голосов
/ 05 апреля 2010

Я только что узнал, что отложенная загрузка в Entity Framework работает только из потока, создавшего ObjectContext. Чтобы проиллюстрировать проблему, я сделал простой тест с простой моделью, содержащей всего 2 объекта: Person и Address. Вот код:

    private static void TestSingleThread()
    {
        using (var context = new TestDBContext())
        {
            foreach (var p in context.Person)
            {
                Console.WriteLine("{0} lives in {1}.", p.Name, p.Address.City);
            }
        }
    }

    private static void TestMultiThread()
    {
        using (var context = new TestDBContext())
        {
            foreach (var p in context.Person)
            {
                Person p2 = p; // to avoid capturing the loop variable
                ThreadPool.QueueUserWorkItem(
                    arg =>
                    {
                        Console.WriteLine("{0} lives in {1}.", p2.Name, p2.Address.City);
                    });
            }
        }
    }

Метод TestSingleThread работает нормально, свойство Address загружается лениво. Но в TestMultiThread я получаю NullReferenceException на p2.Address.City, потому что p2.Address равно нулю.

Это что за баг? Это так, как это должно работать? Если да, есть ли какая-либо документация, в которой это упоминается? Я не смог найти что-либо по этому вопросу в MSDN или Google ...

И что еще более важно, есть ли обходной путь? (кроме явного вызова LoadProperty из рабочего потока ...)

Любая помощь будет очень ценится

PS: я использую VS2010, так что это EF 4.0. Я не знаю, было ли то же самое в предыдущей версии EF ...

1 Ответ

7 голосов
/ 05 апреля 2010

Это по замыслу? Да; любой вызов Load, неявный или явный, в конечном итоге будет проходить через ObjectContext, а ObjectContext задокументирован как не поточно-ориентированный .

Возможный обходной путь - отсоединить объект от контекста объекта в рабочем потоке и присоединить его к контексту объекта в текущем потоке.

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