4

我在 Parallel.ForEach 循环中使用实体框架保存数据。知道 EF 不是线程安全的,我为每个线程实例化了一个实体上下文。

1- 安全吗?正如我在这些帖子中看到的那样:

实体框架 + 多线程 + 延迟加载

每个线程使用一个实体框架上下文是否安全?... 是的?如何?

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 不为空。

我感谢你的帮助。

4

1 回答 1

1

你应该使用ConcurrentDictionaryfor ThreadContexts

更好的是:找到一种在线程中捕获上下文实例的方法,例如通过执行并行任务

var task1 = new Task(() => <your method that instantiates a context>));
于 2012-05-10T20:44:50.643 回答