当前位置: 首页 > 编程语言 > C#

实体框架懒加载不适用于其他线程分享

时间:2023-04-11 00:29:14 C#

实体框架懒加载不适用于其他线程我刚刚发现EntityFramework中的懒加载只对创建ObjectContext的线程起作用。为了说明这个问题,我用一个只包含2个实体的简单模型做了一个简单的测试:Person和Address。这是代码:privatestaticvoidTestSingleThread(){using(varcontext=newTestDBContext()){foreach(varpincontext.Person){Console.WriteLine("{0}livesin{1}.",p.姓名,p.Address.City);}}}privatestaticvoidTestMultiThread(){using(varcontext=newTestDBContext()){foreach(varpincontext.Person){Personp2=p;//避免捕获循环变量ThreadPool.QueueUserWorkItem(arg=>{Console.WriteLine("{0}livesin{1}.",p2.Name,p2.Address.City);});}}}TestSingleThread方法工作正常,地址属性是延迟加载的。但是在TestMultiThread中,我在TestMultiThread中得到一个NullReferenceException,因为p2.Address为空。那个错误?这是它应该工作的方式吗?如果是,是否有任何文档提及它?在MSDN或Google上找不到关于此主题的任何内容……更重要的是,是否有解决方法?(除了从工作线程显式调用LoadProperty之外......)任何帮助将不胜感激PS:我使用的是VS2010,所以它是EF4.0。我不知道它在以前版本的EF中是否相同......这是设计使然吗?是的;对Load、隐藏或显式的任何调用最终都将通过ObjectContext,并且ObjectContext被记录为不是线程安全的。一种可能的解决方法是从工作线程中的对象上下文中分离实体并将其附加到当前线程中的对象上下文。以上是C#学习教程:实体框架懒加载不适用于其他线程共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: