Я только что узнал, что отложенная загрузка в 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 ...