我刚刚发现实体框架中的延迟加载只能从创建
ObjectContext
. 为了说明这个问题,我做了一个简单的测试,一个简单的模型只包含两个实体:
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
地址
属性被延迟加载。但是在
TestMultiThread
,我得到一个
NullReferenceException
在
p2.Address.City
,因为
p2.Address
为空。
那是虫子吗?这就是工作的方式吗?如果有,是否有任何文件提到这一点?我在MSDN或Google上找不到任何关于这个主题的东西。。。
更重要的是,有解决办法吗(除了显式调用
LoadProperty
从工作线程…)
任何帮助都将不胜感激
PS:我用的是VS2010,所以是EF4.0。我不知道以前版本的EF是不是也一样。。。