代码之家  ›  专栏  ›  技术社区  ›  Thomas Levesque

实体框架延迟加载不能从其他线程工作

  •  7
  • Thomas Levesque  · 技术社区  · 16 年前

    我刚刚发现实体框架中的延迟加载只能从创建 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是不是也一样。。。

    1 回复  |  直到 16 年前
        1
  •  7
  •   Craig Stuntz    16 年前

    ObjectContext ,和 ObjectContext is documented to be not thread-safe

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