Tho*_*que 7 c# multithreading entity-framework lazy-loading
我刚刚发现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);
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
该TestSingleThread方法工作正常,Address属性是懒惰加载.但是TestMultiThread,我得到NullReferenceException的p2.Address.City,因为p2.Address是零.
那个bug?这是它的工作方式吗?如果是的话,有没有提到它的文件?我在MSDN或Google上找不到关于这个主题的任何内容......
更重要的是,有解决方法吗?(除了LoadProperty从工作线程显式调用...)
任何帮助将非常感激
PS:我使用的是VS2010,所以它是EF 4.0.我不知道在以前版本的EF中它是否相同...
这是设计的吗?是; 任何对Load,hidden或explicit的调用最终都会通过ObjectContext,而ObjectContext被记录为不是线程安全的.
一种可能的解决方法是将实体与工作线程中的对象上下文分离,并将其附加到当前线程中的对象上下文.