【发布时间】:2012-05-09 14:55:23
【问题描述】:
我在 Parallel.ForEach 循环中使用实体框架保存数据。 知道 EF 不是线程安全的,我为每个线程实例化了一个实体上下文。
1- 安全吗? 好像我在这些帖子中看到的那样:
Entity Framework + Multiple Threads + Lazy Load
Is it safe to use one Entity Framework Context per thread? ... yes? how?
2-在我的上下文创建过程中出现异常,但在 3 次中只有一次,我无法找出原因。
这是我创建上下文的代码:
public partial class Entities
{
private static Entities mfgEntities = new Entities();
private static readonly Dictionary<int,Entities> ThreadContexts = new Dictionary<int, Entities>();
public static Entities Context
{
get
{
if (HttpContext.Current != null)
{
string objectContextKey = HttpContext.Current.GetHashCode().ToString("x");
if (!HttpContext.Current.Items.Contains(objectContextKey))
{
HttpContext.Current.Items.Add(objectContextKey, new Entities());
}
return HttpContext.Current.Items[objectContextKey] as Entities;
}
else
{
int threadId = Thread.CurrentThread.ManagedThreadId;
if (!ThreadContexts.ContainsKey(threadId))
{
try
{
ThreadContexts.Add(threadId, new Entities());
}
catch (Exception ex)
{
throw new Exception("Erreur lors de la création de l'entity context");
}
}
return ThreadContexts[threadId];
}
return mfgEntities;
}
}
}
它会在线抛出 NullReferenceException :
ThreadContexts.Add(threadId, new Entities());
而且 ThreadContexts、threadId 和新的 Entities 都不为空。
感谢您的帮助。
【问题讨论】:
-
它背后的数据库是什么?是甲骨文吗?
-
不可能在该行上抛出 NullRef 异常。您是否使用调试符号进行编译?你确定当你中断时你在正确线程的调用堆栈上吗?
-
这是一个 SQLServer 数据库。
-
@Slugart 我正在调试模式下编译,我很确定我中断了正确的线程调用。我也对该行上的 NullReferenceException 感到困惑,但这就是正在发生的事情。
-
@Leslie 我会尝试让事情更明确以暴露异常的可能性。将 new Entities() 分解为一个 var,然后在调用 Add() 之前在三个 var 中的每一个上断言 not null。还可以尝试清理和重建所有内容。
标签: c# multithreading entity-framework