插入DbContext多线程

时间:2015-01-23 09:02:23

标签: c# multithreading entity-framework dbcontext

尝试从某些任务向DbContext添加新实体时,我收到以下异常,代码在向此事添加任务之前有效。

  

$ exception {"在模型出现时不能使用上下文   已创建。"} System.Exception {System.InvalidOperationException}

我做了一些研究,发现this,它包含了一些有用的信息:

  

此错误的另一个原因可能是您在创建上下文时   第一次因此导致您创建模型   单独线程上的另一个上下文。你将不得不等待其他   模型创建后要创建的上下文实例   完成。

所以我想问题是等待上下文的正确方法是什么?

这是我的代码,以防我猜错我的问题:

using(SampleEntities context = new SampleEntities())
{
    context.Configuration.LazyLoadingEnabled = false; //I tried this in case it was the problem
    Task[] TaskArray = new Task[4];
    for (int i = 0; i < TaskArray.Length; i++)
        TaskArray[i] = Task.Run(() =>
            {
                SampleEntity Result = null;
                while(this._Data.TryDequeue(out Result)) //where Data is a ConcurrentQueue<SampleEntity> with the entities to insert
                {
                    if(!context.SampleEntity.Any(/*Comparisons between properties to check if the entities values are already inserted*/)
                        context.Add(Result);
                }
            }
    Task.WaitAll(TaskArray);
    context.SaveChanges();
}

if(!context.SampleEntity.Any(...

抛出异常

修改

我有大量的寄存器先前已加入_Data,我试图尽可能加快质量插入。

1 个答案:

答案 0 :(得分:1)

一个上下文和许多线程 - 这是一个不好的做法。最好为每个线程创建上下文。我建议你重新考虑你的算法并为每个线程重新设置上下文。