实体框架延迟加载不适用于其他线程

时间:2010-04-04 21:39:06

标签: c# multithreading entity-framework lazy-loading

我刚刚发现Entity Framework中的延迟加载仅适用于创建ObjectContext的线程。为了说明这个问题,我做了一个简单的测试,只有一个包含2个实体的简单模型:PersonAddress。这是代码:

    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或谷歌上找不到任何关于这个主题的内容......

更重要的是,有解决方法吗? (除了从工作线程显式调用LoadProperty之外...)

非常感谢任何帮助

PS:我正在使用VS2010,所以它是EF 4.0。我不知道在以前版本的EF中它是否相同......

1 个答案:

答案 0 :(得分:7)

这是设计的吗?是;任何对隐含或显式的加载调用最终都会通过ObjectContextObjectContext is documented to be not thread-safe

可能的解决方法是将实体与工作线程中的对象上下文分离,并将其附加到当前线程中的对象上下文。

相关问题