c# - Entity Framework 延迟加载不适用于其他线程

标签 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 中,我在 p2.Address.City 上得到了一个 NullReferenceException,因为 p2.Address 是空的。

这是一个错误吗?这是它应该工作的方式吗?如果是这样,是否有任何文件提及它?我在 MSDN 或 Google 上找不到关于该主题的任何内容...

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

任何帮助将不胜感激

PS:我用的是VS2010,所以是EF 4.0。不知道之前版本的EF是不是一样...

最佳答案

这是设计使然吗?是的;任何对 Load 的调用,无论是隐式的还是显式的,最终都会通过 ObjectContextObjectContext is documented to be not thread-safe .

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

关于c# - Entity Framework 延迟加载不适用于其他线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2575990/

相关文章:

c# - 类型参数的约束,是否可以有可选类型

c# - 有什么理由不使用嵌套的 EF 实体上下文吗?

c# - 运行linq命令时出现Unrecognized attribute 'name'错误

c# - 无法访问同一类中声明的类实例

c# - 使用具有随机间隔的定时器

c# - 索引文件大小限制

asp.net-mvc - 具有 ADO.NET Entity Framework 的强类型 ASP.NET MVC

c# - BackGround Thread with timer for application level-WPF Application

c# - 如何避免主体从工作线程传播到 GUI 线程

java - 为什么这段代码不会导致竞争条件?