我刚刚发现 Entity Framework 中的延迟加载只能在创建 ObjectContext
的线程中起作用。为了说明这个问题,我做了一个简单的测试,一个简单的模型只包含 2 个实体: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
方法工作正常,Address
属性被延迟加载。但是在 TestMultiThread
中,我在 p2.Address.City
上得到了一个 NullReferenceException
,因为 p2.Address
是空的。
这是一个错误吗?这是它应该工作的方式吗?如果是这样,是否有任何文件提及它?我在 MSDN 或 Google 上找不到关于该主题的任何内容...
更重要的是,是否有解决方法? (除了从工作线程显式调用 LoadProperty
...)
任何帮助将不胜感激
PS:我用的是VS2010,所以是EF 4.0。不知道之前版本的EF是不是一样...
最佳答案
这是设计使然吗?是的;任何对 Load 的调用,无论是隐式的还是显式的,最终都会通过 ObjectContext
和 ObjectContext is documented to be not thread-safe .
一个可能的解决方法是从工作线程中的对象上下文中分离实体并将其附加到当前线程中的对象上下文。
关于c# - Entity Framework 延迟加载不适用于其他线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2575990/