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

Tho*_*que 7 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);
                    });
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

TestSingleThread方法工作正常,Address属性是懒惰加载.但是TestMultiThread,我得到NullReferenceExceptionp2.Address.City,因为p2.Address是零.

那个bug?这是它的工作方式吗?如果是的话,有没有提到它的文件?我在MSDN或Google上找不到关于这个主题的任何内容......

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

任何帮助将非常感激

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

Cra*_*ntz 7

这是设计的吗?是; 任何对Load,hidden或explicit的调用最终都会通过ObjectContext,而ObjectContext被记录为不是线程安全的.

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