Ленивая загрузка Entity Framework не работает из другого потока
Я только что узнал, что отложенная загрузка в 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 ...